Как Pharaoh работал в 16 мегабайтах памяти

Стратегии конца 1990-х годов предъявляли к компьютерам необычные требования. Игровой код должен был сотни раз за кадр рисовать юнитов, здания и тайлы, причём затрагивать почти каждый пиксель на экране. Аппаратный блиттинг уже позволял выполнять такие операции достаточно быстро, но память оставалась критически ограниченным ресурсом.
Для Pharaoh это было особенно заметно. Древнеегипетская стратегия строилась вокруг большого города, где одновременно отображались дома, жители, храмы, анимации и военные подразделения. Спрайты имели варианты движения в восьми направлениях, а в игре присутствовали двенадцать армий врагов. Крупные монументы и вовсе выводились отдельным проходом: они занимали много места и могли не помещаться в стандартную область экрана.
Графики на сотни мегабайт и компьютер с 16 МБ RAM
На диске Pharaoh хранилось около 302 МБ графических данных. Для современного компьютера это небольшая величина, но в конце девяностых оперативная память была несопоставимо меньше. В конфигурационном INI-файле игры можно найти параметр RAM, значение которого по умолчанию установлено на 15. Оно примерно соответствовало объёму памяти, доступному типичной машине того времени.
Разработчики предусмотрели и отдельный режим для ещё более скромных конфигураций. Если в компьютере было меньше 16 МБ оперативной памяти, игра переходила в режим «мало памяти». На системе с 14 МБ, например, она принудительно использовала разрешение 640×480 и упрощала цикл симуляции города. Это позволяло запускать игру на распространённых машинах, не пытаясь удерживать в памяти всё сразу.
Собственный формат вместо универсальных решений
Обычные средства хранения и обработки графики плохо подходили для ситуации, в которой движку требовалось быстро получать многочисленные изображения, но не держать все данные в исходном виде. Поэтому студия Impressions ещё во время разработки Caesar создала собственный формат сжатия графики.
Его назначение состояло не только в том, чтобы уменьшить размер файлов на диске. Формат должен был помочь рационально использовать оперативную память и ускорить работу с изображениями во время отрисовки. В результате архитектура движка определялась не столько абстрактной красотой решений, сколько тем, как именно данные размещаются в пределах доступных 16 МБ.
Разобраться в этих приёмах помогает проект Tutankhamun — реимплементация Pharaoh на C. Работа над ним началась около трёх лет назад и со временем дошла до состояния с понятными исходниками. Анализ реальных файлов игры и кода проекта позволяет увидеть, какие компромиссы приходилось принимать разработчикам стратегий конца девяностых, чтобы совместить насыщенную картинку, сложную симуляцию города и крайне ограниченный объём памяти.


