unsigned char **bmp_cdn,
bmp_cdn = new unsigned char*[640];
for(i=0; i<640; i++)
bmp_cdn=new unsigned char[480];
[Borland C++ 3.1] Графика под дос. Огромные объемы.
Почитал о bmp, открыл, вывел, всё отлично... но...
Открытие файла происходит очень медленно, у меня на машине это не заматно, но в ВУЗЕ и на машиене в соседней комнате это занимает около трёх секунд.
По совету препода и одногруппников, решил перед тем, как программа запуститься, считать все картинки в оперативную память и с неё напрямую их грузить.
Здесь как раз и вышла заморочка.
Выставил в компияторе heapsize 640 Kb, начал выделять память.
У меня около 10 картинок 640x480 256(цв), следовательно выделил:
Код:
Подгрузил картинку, всё ок. Но потом понял, что я уже использовал 640*480*1 байт или 300 кб, памяти у меня под всё 500 с чем-то (проверил спец. функцией). Второй раз выделить столько же не получилось.
Вопрос такой, можно ли как-нибудь обхитрить это дело и занести в ОЗУ через DOS хотя бы 3000 кб, ведь я точно знаю, что к примеру такие игры как Doom, Quake подгружали в память намного больше, и писались под C++ (правда компиль был другой), однако они тоже под Dos.
Или хотя бы подскажите, как можно загрузить эти 10 картинок, чтобы используя всего около 500 кб, можно было играть вполне без подзагрузок. Вариант каждый раз вывешивать 'Loading' не очень то нравиться, учитывая, что небольшие объекты в игре должны быть подвижными.
"Это ограничение к сожалению преследует MS DOS и аналогичные ей ОС других производителей, начиная с того момента, как горячо любимый в околокомпьютерных кругах Билл Гейтс заявил, что 640 килобайт достаточно для всех возможных задач ПК."
Видимо больше никак... как быть...
SPAWNO - единственное, что там нашёл. Но мне бы хотелось помимо ссылки услышать комментарии. Как с ним работать и что конкретнее он делает.
Меня тоже интересует этот вопрос, но никак не могу найти доку.
Не могли бы поделится тем, что у вас уже получилось?
Поспрашивал на других форумах, у препода + у согруппников, посоветовали использовать far указатели, т.е. выделять память в отдельном сегменте. Сейчас разбираюсь.
Нужно использоdать DOS-расширители, которые работают с памятью выше 1Мб (типа DPMI), соответственно, в защищенном режиме.
Код:
INT 21 - DOS 2+ - ALLOCATE MEMORY
AH = 48h
BX = number of paragraphs to allocate
Return: CF clear if successful
AX = segment of allocated block
CF set on error
AX = error code (07h,08h) (see #01680 at AH=59h/BX=0000h)
BX = size of largest available block
Notes: DOS 2.1-6.0 coalesces free blocks while scanning for a block to
allocate
.COM programs are initially allocated the largest available memory
block, and should free some memory with AH=49h before attempting any
allocations
under the FlashTek X-32 DOS extender, EBX contains a protected-mode
near pointer to the allocated block on a successful return
SeeAlso: AH=49h,AH=4Ah,AH=58h,AH=83h
--------D-2149-------------------------------
INT 21 - DOS 2+ - FREE MEMORY
AH = 49h
ES = segment of block to free
Return: CF clear if successful
CF set on error
AX = error code (07h,09h) (see #01680 at AH=59h/BX=0000h)
Notes: apparently never returns an error 07h, despite official docs; DOS 2.1+
code contains only an error 09h exit
DOS 2.1-6.0 does not coalesce adjacent free blocks when a block is
freed, only when a block is allocated or resized
the code for this function is identical in DOS 2.1-6.0 except for
calls to start/end a critical section in DOS 3.0+
SeeAlso: AH=48h,AH=4Ah
--------D-214A-------------------------------
INT 21 - DOS 2+ - RESIZE MEMORY BLOCK
AH = 4Ah
BX = new size in paragraphs
ES = segment of block to resize
Return: CF clear if successful
CF set on error
AX = error code (07h,08h,09h) (see #01680 at AH=59h/BX=0000h)
BX = maximum paragraphs available for specified memory block
Notes: under DOS 2.1-6.0, if there is insufficient memory to expand the block
as much as requested, the block will be made as large as possible
DOS 2.1-6.0 coalesces any free blocks immediately following the block
to be resized
SeeAlso: AH=48h,AH=49h
AH = 48h
BX = number of paragraphs to allocate
Return: CF clear if successful
AX = segment of allocated block
CF set on error
AX = error code (07h,08h) (see #01680 at AH=59h/BX=0000h)
BX = size of largest available block
Notes: DOS 2.1-6.0 coalesces free blocks while scanning for a block to
allocate
.COM programs are initially allocated the largest available memory
block, and should free some memory with AH=49h before attempting any
allocations
under the FlashTek X-32 DOS extender, EBX contains a protected-mode
near pointer to the allocated block on a successful return
SeeAlso: AH=49h,AH=4Ah,AH=58h,AH=83h
--------D-2149-------------------------------
INT 21 - DOS 2+ - FREE MEMORY
AH = 49h
ES = segment of block to free
Return: CF clear if successful
CF set on error
AX = error code (07h,09h) (see #01680 at AH=59h/BX=0000h)
Notes: apparently never returns an error 07h, despite official docs; DOS 2.1+
code contains only an error 09h exit
DOS 2.1-6.0 does not coalesce adjacent free blocks when a block is
freed, only when a block is allocated or resized
the code for this function is identical in DOS 2.1-6.0 except for
calls to start/end a critical section in DOS 3.0+
SeeAlso: AH=48h,AH=4Ah
--------D-214A-------------------------------
INT 21 - DOS 2+ - RESIZE MEMORY BLOCK
AH = 4Ah
BX = new size in paragraphs
ES = segment of block to resize
Return: CF clear if successful
CF set on error
AX = error code (07h,08h,09h) (see #01680 at AH=59h/BX=0000h)
BX = maximum paragraphs available for specified memory block
Notes: under DOS 2.1-6.0, if there is insufficient memory to expand the block
as much as requested, the block will be made as large as possible
DOS 2.1-6.0 coalesces any free blocks immediately following the block
to be resized
SeeAlso: AH=48h,AH=49h
если с прерываниями лень возится , то
автор, а где вы прочитали про загрузку картинок в борланд си++3.1 ? Я уже неделю ничего по этой теме найти не могу(