Создатель Fallout Тим Кейн раскрыл секреты оптимизации памяти в оригинальной игре

Тим Кейн, создатель культовой постапокалиптической RPG Fallout, поделился интересными техническими подробностями разработки игры. В своем недавнем видео Кейн рассказал, как команда преодолела серьезные ограничения компьютеров 90-х годов и создала собственную систему управления памятью, позволившую игре работать на маломощных машинах.

Минимальные требования для Fallout были очень низкими, особенно в плане памяти – всего 16 мегабайт. Это невероятно мало. Чтобы представить визуально: если смотреть на экран Fallout с разрешением 640×480, то вся доступная память для кода, данных и графики – это всего 48 таких экранов.

https://www.youtube.com/watch?v=6kB_fko6SIg

На ранних этапах разработки команда столкнулась с критической проблемой в компиляторе Watcom C, который использовался для создания игры. Кейн обнаружил серьезную ошибку в функции realloc, которая иногда выделяла блок памяти, уже занятый другими данными.

Я написал им письмо, но они не поверили мне. В их защиту скажу, что они наверняка получали множество жалоб от программистов, которые просто пишут плохой код и винят компилятор.

Чтобы доказать существование ошибки, Кейн создал простую тестовую программу, демонстрирующую проблему. Через несколько дней разработчики компилятора признали наличие бага и пообещали выпустить патч. Однако доверие к стандартным функциям управления памятью было подорвано.

В результате команда Fallout решила разработать собственную систему управления памятью. При запуске игра вызывала malloc (одна из трех основных функций в языке C для управления динамической памятью) только один раз, получая один огромный блок памяти, и больше никогда не обращалась к стандартным функциям.

Когда игре требовался блок памяти, она вызывала одну из наших функций, которая выделяла часть из этого большого блока. Мы сами управляли выделением, перераспределением и освобождением памяти.

Ключевой особенностью разработанной системы было использование хэндлов вместо прямых указателей. Так, если коду требовалось получить доступ к данным, он "блокировал" хэндл и получал указатель. Пока хэндл оставался заблокированным, указатель был действительным. После "разблокировки" данные оставались в памяти, но доступ к ним был возможен только через повторную блокировку хэндла.

Такой подход позволил реализовать уплотнение памяти. Если игра обнаруживала, что свободная память фрагментирована (например, 500 байт в одном месте и 500 в другом), она могла перемещать незаблокированные блоки, собирая всю свободную память в один непрерывный участок.

Это позволило Fallout работать на гораздо более слабых машинах, чем должно было быть возможно по тем временам. Для Interplay и маркетинга это было крайне важно, потому что больше людей могли купить игру.

Кейн отметил в ролике, что сегодня такие техники не требуются благодаря виртуальной памяти в современных операционных системах, но тогда эти низкоуровневые оптимизации были необходимы для выпуска игры.

Если бы я делал Fallout сейчас в Unity, я мог бы создать ее гораздо быстрее и, вероятно, с меньшей командой. Но тогда мы строили все с нуля, и некоторые вещи, которые мы делали, были настолько низкоуровневыми, что требовали действительно хороших навыков оптимизации и написания кода.

Тем временем, поклонник Fallout продолжает создавать свой невероятно крутой мод для GZDoom, который представляет одну из частей игры с видом от первого лица и шикарными анимациями.