Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Графика под дос и её хранение в ОЗУ. Прочёл bmp, а поместить в ОЗУ проблема. 
:(
    Опции темы
demonoide
Дата 15.4.2007, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 15.4.2007
Где: Невоград

Репутация: нет
Всего: нет



Вот начал окультуривать свою курсовую игрушку. Пишу в Borland C++ 3.1
Почитал о bmp, открыл, вывел, всё отлично... но...

Открытие файла происходит очень медленно, у меня на машине это не заматно, но в ВУЗЕ и на машиене в соседней комнате это занимает около трёх секунд.

По совету препода и одногруппников, решил перед тем, как программа запуститься, считать все картинки в оперативную память и с неё напрямую их грузить.

Здесь как раз и вышла заморочка.

Выставил в компияторе heapsize 640 Kb, начал выделять память.
У меня около 10 картинок 640x480 256(цв), следовательно выделил:

Код

 unsigned char **bmp_cdn,
 bmp_cdn = new unsigned char*[640];
  for(i=0; i<640; i++)
    bmp_cdn[i]=new unsigned char[480];


Подгрузил картинку, всё ок. Но потом понял, что я уже использовал 640*480*1 байт или 300 кб, памяти у меня под всё 500 с чем-то (проверил спец. функцией). Второй раз выделить столько же не получилось.

Вопрос такой, можно ли как-нибудь обхитрить это дело и занести в ОЗУ через DOS хотя бы 3000 кб, ведь я точно знаю, что к примеру такие игры как Doom, Quake подгружали в память намного больше, и писались под C++ (правда компиль был другой), однако они тоже под Dos.

Или хотя бы подскажите, как можно загрузить эти 10 картинок, чтобы используя всего около 500 кб, можно было играть вполне без подзагрузок. Вариант каждый раз вывешивать 'Loading' не очень то нравиться, учитывая, что небольшие объекты в игре должны быть подвижными.

PS: Знаю, что 640 кб - это предел, как завещал наш бог Билли Гейц, этого достаточно для программ в DOS)))
Переезжать на WinAPI к примеру или OpenGL я не собираюсь, т.к. очень много работы уже под Dos, а именно прорисовки, сделано.
PM MAIL WWW ICQ Skype   Вверх
MAKCim
Дата 15.4.2007, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



использовать нереальный режим (unreal mode)
получим возможность использовать адресацию 32-ух разрядного режима (а значит получим доступ ко всей памяти) при отсутствии всех ограничений в плане защиты (в отличии от защищенного режима)

Это сообщение отредактировал(а) MAKCim - 15.4.2007, 20:06


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
bsa
Дата 15.4.2007, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Все досовские игрушки, богатые графикой, запускали расширение DOS 4 GW (если не ошибаюсь в названии) - это расширение предназначеное для работы программы в защищенном режиме (поправьте, если я его путаю с "нереальным", так как о таком режиме слышу впервые). Кажется, программы, использующие это расширение, были скомпилированы на Watcom C.
Только учти, что в защищенном режиме не работают прерывания БИОС (например, переключение режимов работы дисплея), поэтому, к этим играм прилагался драйвер видеокарт. Забыл как назывался, но помню, что он не поддерживал изделия NVIDIA.

Короче, мой совет, переходи на API операционной системы защищенного режима, иначе реализовать будет трудно.

Из-под ДОС в реальном режиме, можно попробовать обратиться к драйверу HIMEM.SYS с просьбой выделить память... Но я этого никогда не делал.
PM   Вверх
MAKCim
Дата 15.4.2007, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(bsa @  15.4.2007,  20:18 Найти цитируемый пост)
это расширение предназначеное для работы программы в защищенном режиме

нереальный режим - это реальный режим без адресных ограничений
так что это немного другое


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
bsa
Дата 15.4.2007, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Если честно, не припоминаю такого режима. У x86 начиная с i386 было 3 режима:
1. реальный
2. защищенный
3. виртуальный x86

"Нереального" тут нет. Или ты про работу в 0 кольце защиты?
PM   Вверх
Daevaorn
Дата 15.4.2007, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



PM MAIL WWW   Вверх
bsa
Дата 15.4.2007, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Блин. Забыл про этот "хак". Не думаю, что стоит его использовать напрямую. Лучше уж через HIMEM.SYS - хотя бы не будет проблем со smartdrv.exe.  smile 
Вот только меня гложат смутные сомнения на счет реализуемости этого без привлечения ассемблера.
PM   Вверх
MAKCim
Дата 15.4.2007, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(bsa @  15.4.2007,  21:27 Найти цитируемый пост)
Вот только меня гложат смутные сомнения на счет реализуемости этого без привлечения ассемблера. 

если без использования библиотек, без ассемблера никак  smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
dizzy1984
Дата 16.4.2007, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: 3
Всего: 25



Все что я знаю об этом.

1). Использование Xms через himem.sys
Если мне не изменяет память это позволит тебе записывать в память до 64 mb.
Однако там не будет прямой адресации, будет косвенная через буфер, лежащий в 640кб. 
Процесс таков :
1. Начало программы. Записать данные в область памятивыше >1m
2. Необходимость использования данных. Скопировать их из >1mb в <640кб.
3. Использовать.
Таким образом за возможность использовать >1m память ты платишь
1. необходимость использовать операцию memcpy размером нужных тебе данных.
2. надо место под буфер в памяти <640 кб.
Такой способ имел название "быстрый жесткий диск"

2). Используй компилер watcom c++ 10.0
С ним тяжело разобраться, но с ним идет дос-расширитель do4gw, который ничего не просит,
а дает возможность явной адресации. Там уже будет не сегмент смещение.

Я сам писал как-то порт клона движка wolfenstain3d Фрунзе на tc3.0 и использовал схему с xms.
Если ты будешь мудро использовать память. (мало операций memcpy), то скорость будет очень высокая.

Кстати небольшой оффтоп.
wolfenshtain 3d писался на borland c++ 3.1
doom2 - watcom (версию не помню)
quake2 - visual c++ 6.0

Вот ссылка на техническое описание
У меня есть реализация под turbo c++ 3.0
если тебе интересно, могу ее выслать.
PM MAIL   Вверх
betal
Дата 16.4.2007, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 26.12.2006

Репутация: нет
Всего: 1



 smile 
--------------------
101100010100001101100001110100101111011легкие деньги
PM WWW ICQ   Вверх
dizzy1984
Дата 16.4.2007, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: 3
Всего: 25



Вот вырезки из моей многострадальной недоделанной игрушки.

Общие вещи... проверяем наличие драйвера, доступность хотя бы метра памяти свыше 640кб.
Код

  printf("Searching for XMS driver...");
  if (XmsFound()) {
    printf(" OK\n");
    XmsDriver = ( void (far *) () )GetXmsDriverAddress();
    printf("Checking Size Of Available XMS Memory...");
      if (GetXmsAvailMemory()<1024) {
    printf(" Wolf Needs At Least 1M\n");
    return;
      }
    else printf(" OK\n");
  }
    else {
      printf(" XMS Driver not found\n");
      return;
    };


Грузим те текстуры, которые составляли основу дизайна уровней.
Их много, поэтому в conventional memory они не умещаются.

Код

printf("Loading Textures...");
switch (XmsLoad=LoadTexturesIntoXms()) {
    case BADBUFALLOCK : printf(" Cannot Allock Space\n");return;
    case XMSLOADOK    : printf(" OK\n");break;
    default : switch (XmsLoad>>8) {
        case 0 : printf(" %s Load Error\n",WallTexturesFilenames[XmsLoad&0x00FF]);return;
        case 1 : printf(" %s Load Error\n",DoorTexturesFilenames[XmsLoad&0x00FF]);return;
        case 2 : printf(" %s Load Error\n",Enemy1TexturesFilenames[XmsLoad&0x00FF]);return;
        case 6 : printf(" %s Load Error\n",SpriteTexturesFilenames[XmsLoad&0x00FF]);return;
        case 8 : printf(" %s Load Error\n",MiscTexturesFilenames[XmsLoad&0x00FF]);return;
        //
          };
  };

Текстуры грузились группами, т.к число дескрипторов, отводившихся под адреса памяти было ограничено кажется 16-ю. Т.е загрузить можно хоть 64mb, но не более 16-ти кусков. Про это должно быть сказано в спецификации и мне это не кажется неудобным.

Какая-то функция для удобства дальнейшей работы.

Код

AsciiToXmsTexturesIds();


Где-то в дебрях функции отрисовки стен, дверей и спрайтов врагов.
Код

XmsConv(s->Texture.Handle,s->Texture.Offset,CurrentTexture,64*64);


Отрисовка статус бара
Код

XmsConv(GroupHandles[MISCELLANEOUSGROUP],STATUSBAR,buf+166*320l,34*320);


Ну и завершение работы с xms
Код

atexit(WolfExitProc);
...

void WolfExitProc() {
...
FreeXmsTextures();
...
}


На пне 166 игрушка давала 30 кадров в секунду, а на каждый кадр происходило копирование 2-8 текстур стен (4096 байт каждая), 1-4 спрайтов врагов (тоже 4096), 34*320 байт на строку состояния игрока. Т.е тормозил игру только просчет геометрии мира, но не копирование из >1m памяти.

Я ложу 4 файла XMS.CPP XMS.H XMSTEXTU.CPP XMSTEXTU.H. Это работа с xms. В плане самой программы там, конечно, есть зависимости от других модулей


Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  WolfShte.rar 2,42 Kb
PM MAIL   Вверх
regis
Дата 17.4.2007, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 12.12.2005
Где: Москва, Россия

Репутация: 2
Всего: 7



К приведенному списку игр маленькое добавление: Quake 1 для DOS. Он был откомпилирован DJGPP -- портом GCC для DOS, который использовал свой собственный DOS-экстендер и CWSDPMI в качестве DPMI-сервера. А DOOM1/2 - действительно Watcom C с DOS4GW в качестве экстендера. (Кстати, есть бесплатная альтернатива DOS4GW: PMODE/w или как-то в этом роде называется.)



--------------------
В. В чем разница между hardware и software?О. В отличие от второго, по первому можно двинуть кулаком или пнуть ногой.
PM MAIL WWW   Вверх
shemsu
Дата 17.4.2007, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 12.4.2007
Где: Israel

Репутация: нет
Всего: нет



А что, если в DOS просто использовать EMS в качестве XMS с помощью EMM386.exe, предварительно отредактировав config.sys? Взять сколько нужно памяти, или же всю доступную.
PM MAIL WWW ICQ   Вверх
demonoide
Дата 18.4.2007, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 15.4.2007
Где: Невоград

Репутация: нет
Всего: нет



Нифигасе smile: это конечно замечательно, но боюсь со своей ВУЗ'овской нагрузкой мне с этим не разобраться, слышал, что можно использовать far указатели, можете пояснить, что это такое и с чем едят, да и можно ли действительно с ними работать под Borland C 3.1?
PM MAIL WWW ICQ Skype   Вверх
MAKCim
Дата 18.4.2007, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



demonoide, 
в DOS (= реальный режим работы CPU)
любой адрес так или иначе определяется как A << 4 + B, где A - значение регистра CS/DS/SS/ES/GS/FS, а B - значение регистра IP (если A = CS) или любое 16-ти битное значение, используемое в качестве адресного операнда относительно DS/SS/ES/GS/FS
обычный (не far) указатель содержит это 16-ти битное значение в то время как far указатель дополнительно содержит 16-ти битный сегментный адрес (А)


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0595 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.