Одной из самых интересных и забавных книг, которые я прочитал в прошлом году, была Черная книга игрового движка: Wolfenstein 3D Фабьена Сангларда ». Некоторое удовольствие я получаю от ностальгических ощущений, которые я испытал при чтении этой книги: моим первым компьютером был 386SX, и часто использовалась дискета с условно-бесплатной версией Wolfenstein 3D. Кому-то доставляло удовольствие выдумывать и вдаваться в подробности некоторых листингов ассемблерного кода. В любом случае, я получил удовольствие от чтения.

Книга начинается с предыстории аппаратного обеспечения, доступного на момент создания Wolfenstein 3D, и освещаются технические проблемы создания игры-стрелялки от первого лица, которая могла бы работать на ней. Есть небольшая глава о команде id Software (если вам интересна эта тема, я рекомендую еще одну замечательную книгу, Masters of Doom), а затем есть важная часть: глубокое погружение в движок Wolfenstein.

Когда я рассказываю людям об этой книге, возникает вопрос, почерпну ли я из нее какую-нибудь полезную информацию. Хотя я читал это в основном для развлечения, это заставило меня задуматься. Чему разработчик программного обеспечения может научиться в 2018 году, прочитав книгу об игре, разработанной в начале 90-х? Вот мои выводы.

Представление с плавающей запятой

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

Незначительные оптимизации производительности имеют значение

Мы живем в странном мире.

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

Это интересная тема, которая заслуживает отдельного поста. Я отмечу здесь только два момента: с точки зрения бизнеса нормальная производительность и пара дополнительных функций обычно предпочтительнее, чем потрясающая производительность с использованием только базовых функций; и программисты приложили бы дополнительные усилия для оптимизации производительности, если бы увидели большие выигрыши - вдвое уменьшили объем памяти или заставили что-то работать на порядок быстрее.

Это означает, что все мелкие оптимизации остались невыполненными. Но именно такая оптимизация сделала Wolfenstein 3D возможной! Вероятно, был один или два основных трюка, которые заставили людей из id Software думать, что этот проект можно реализовать, но в остальном они сэкономили 10% здесь и 5% там, чтобы получить приличную частоту кадров.

Не стоит недооценивать силу сложных процентов.

Метапрограммирование

Видеокарты VGA не имели аппаратной поддержки масштабирования текстур, поэтому это приходилось делать программно. Для повышения производительности нельзя производить все вычисления на лету. Что было необходимо, так это набор простых процедур сборки «нарисовать N-й столбец текстуры, уменьшив его до 40 пикселей».

Они не были написаны от руки. Вместо этого была функция, которая генерировала все необходимые «средства масштабирования» во время выполнения. Это был пример метапрограммирования: программа, пишущая другую часть себя.

В мире Android у нас есть несколько видов метапрограммирования: обработка аннотаций, отражение, переплетение кода и недавно появившиеся плагины компилятора Kotlin. Проблема с ними в том, что они чувствуют себя чуждыми, имеют серьезные ограничения или плохо взаимодействуют с обычным кодом. Они очень помогают, но я бы хотел, чтобы был лучший вариант, более естественный.

Преобразуйте свои активы, чтобы они были готовы к использованию

Спрайты в Wolfenstein 3D - враги, добыча, элементы окружающей среды - не сохранялись и не копировались как обычные растровые изображения. Чтобы обрабатывать как масштабирование, так и прозрачность, они были преобразованы в небольшие метапрограммы, которые модифицировали обычные средства масштабирования текстур.

В том же формате они хранились на диске в файлах игровых ресурсов! Преобразование реальных ресурсов, предоставленных художником, во что-то, что игра может использовать во время выполнения, было выполнено как часть процесса сборки. Это определенно метод, который может пригодиться сейчас или даже в далеком будущем.

Не совершенствуйте некритичный код

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

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

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

Fizzlefade

Когда ваш персонаж умирает в Wolfenstein 3D, экран постепенно покрывается красными пикселями. Один из способов добиться этого - выделить список всех возможных экранных координат и перетасовать его, но это было бы ужасно неэффективно и невыполнимо для оборудования начала 90-х.

Разработчики id Software нашли другой, довольно непонятный способ добиться того же эффекта: метод, названный Регистр сдвига с линейной обратной связью. Это позволило им сгенерировать последовательность всех координат пикселей с помощью всего лишь набора операций XOR и без каких-либо накладных расходов на память. Поистине блестящее решение возникшей проблемы.

Плохие части

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

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

Но подождите, есть еще кое-что ...

Сегодня утром в Твиттере пришло уведомление о том, что Game Engine Black Book: Doom доступен для покупки. Я не колебался ни секунды и заказал копию. Я призываю вас сделать то же самое.