На что портировали doom
Все устройства, на которых можно запустить Doom: готовьте ваш калькулятор
Легендарный Doom, который появился уже больше 20 лет назад, до сих пор не отпускает своих истинных фанатов. Более того, они играют не только на компьютере, но и на другой технике. Иногда только диву даешься от того, на чем запускают игру. В данной статье собраны самые интересные устройства, на которых можно поиграть в Doom, так что устраивайтесь поудобнее и приготовьтесь удивиться.
Автомобиль
Недавно Doom был запущен на компьютере в Porshe 911. Это было показано на видео, которое 19 февраля показал на своем канале пользователь vexal. Он просто вставил в USB-порт флэшку, а также вставил диск в CD-привод. Передвижение в игре происходило с помощью руля, педалей, а также коробки передач, для чего пришлось колесить по парковке. Видео оказалось фейком, к счастью и безопасности окружающих.
Однако в 2015 году пользователь с ником DavidXNewton показал, что в его автомобиле Honda Fit всё-же можно запустить Doom. Правда с помощью установленного там мини-компьютера Raspberry Pi. Конечно, это уже не так зрелищно, но зато куда безопаснее предыдущего варианта.
DOOM на калькуляторе
Еще один неплохой вариант, который поможет развлечься на скучном экзамене. Конечно на обычном калькуляторе запустить игру не получится, зато вот на научном калькуляторе — почему бы нет? Изображение, правда, не блещет.
Однако, если поработать над графикой и адаптировать ее под калькулятор.
Принтер
Если у вас под рукой есть принтер с цветным экраном, то почему вы еще сидите? Бегом запускать на нем Doom!
Одна проблема — отсутствие звука. Видите рядом еще один принтер? Вперед запускать на нем саундтрек!
Приобрести умные часы можно хотя бы ради того, чтобы запустить на них Doom. С этой задачей справится и Android Wear и Apple Watch. Еще один способ развлечься в любой ситуации.
Банкомат
Так как внутри банкомата располагается самый обычный компьютер, то на нем можно запускать игры. Для управления используйте кнопки ввода банкомата.
Электронная книга
Утомились при чтении книги? Пора расслабиться и как следует пострелять!
Айпод
Или же иной плеер с экраном.
Бензопила
Если вы хотите острых ощущений, то можете попробовать сыграть в Doom на бензопиле. Правда предварительно придется встроить в пилу компьютер Raspberry Pi и экран.
Рекламный баннер
Фотоаппарат
Тачбар
В конце прошлого года компания Apple явила миру новое поколение MackBook Pro, которые имеют TouchBar — узкий сенсорный экран над клавиатурой. И на нем тоже можно запустить Doom.
Осциллограф
Данный вариант нельзя назвать честным, так как внутри данного устройства находится простой компьютер под управлением Windows 95. Все, что нужно — установить игру и запустить.
Хотя в теории возможно и полностью портировать игру на осциллограф. Ведь если получилось с Quake, то почему бы не проделать такое с Doom?
На клавиатуре
В далеком 2008 году «Студия Артемия Лебедева» выпустила свою клавиатуру под названием «Оптимус Максимус», где каждая клавиша имела небольшой цветной экран, чтобы пользователи имели возможность настроить клавиатуру под себя. Игру запустили, в этом случае, очень сложно. В Doom играли на компьютере, но специальная программа всё время делала скриншоты и отправляла их на клавишу.
Ну и, наконец, подходим к концу. В GZDoom, который является фанатским портом Doom, имеется игровой автомат, на котором вы можете поиграть в Doom. Таким образом вы будете играть в Doom, играя в Doom.
На чём запускали DOOM
Есть такая народная забава, портировать Doom на всякие калькуляторы. Массовым это увлечение стало уже в декабре 1997 года когда Джон Карман перевёл исходники Doom под лицензию GPL сделав их общедоступными для некоммерческого использования. В этой статье мы расскажем немного об этой забаве и приведём 5 самых интересных портаций DOOM.
Сам Doom написан на языке С, достаточно низкоуровневом и близком к железу языке, что делает портацию на самые разные устройства более простой и осуществимой задачей.
24 июня 2009 ID Software была приобретена издательством ZeniMax Media, которое в спустя несколько лет перевела под лицензию GPL исходный код других продуктов разработанных ID Software, такие как Quake 2, 3, Wolfenstein 3D а впоследствии и Doom 3 BFG Edition.
Посмотреть исходники игр студии можно тут — https://github.com/id-Software
А непосредственно Doom’a тут — https://github.com/id-Software/DOOM
Важное замечание, что под лицензией GPL только исходный код, а игровые файлы, музыка, текстуры все ещё остаются платными и продаются в steam. Таким образом компания имеет возможность продолжать зарабатывать на этих тайтлах давая возможность разработчикам всего мира перенять их опыт и хорошие (а также и плохие, например wolf_actor_ai.c ) решения.
Так на что же портировали Doom?
В первую очередь Doom конечно портировали на различные устройства и платформы, чтобы в него действительно можно было поиграть. К такого рода портам например относится портирование на Adobe Flash. Можете поиграть в DOOM на известном сайте Flash игр NewGrounds.
Также Doom запустили в браузере с помощью JavaScript. Но тут все на порядок сложнее, так как на JS написали порт DOS эмулятора Dos-Box и уже в нём запускается DOOM (а также многие другие игры). В общем матрёшка получилась такая, что лично у меня DOOM тормозит.
А также можете встроить это решение на свой собственный сайт:
Периодически DOOM продолжают портировать на игровые консоли, например не так давно его портировали на Nintendo Switch
С некоторой натяжкой можно сказать, что также для того чтобы поиграть DOOM портировали на Apple Ipod nano
https://youtu.be/5aKeACL2giA
А вот на остальные девайсы DOOM портировали просто потому что могут. Список устройств действительно уникален
И вот наши топ5 устройств для игры в Doom
5 — TouchBar MacBook Pro
DOOM запустили на MacBook Pro — эта фраза вовсе не вызывает удивления. Совсем другое дело в том, что его запустили не на экране, а на TouchBar’e макбука. Играть на нём конечно совершенно не возможно, но ведь работает.
4 — На кнопке клавиатуры Оптимус Максимус
Это клавитура от студии Артемия Лебедева на каждой кнопке которой есть небольшой экранчик. Чтобы “запустить” на ней DOOM, пришлось сильно извратится, по сути, сам DOOM работает на машине к которой подключена клавиатура, специальная программа очень часто делает скриншоты игры который и показываются на кнопке клавиатуры.
В отличие от TouchBar’a играть уже можно, хотя конечно и не удобно.
3 — На пианино.
Это конечно специальное пианино с дисплеем, где кнопки пианино при нажатии не только издают звуки, ну и служат для управления в игре. Можете сами оценить, какая “симфония” получается при игре в DOOM.
2 — На бензопиле.
Конечно для этого пришлось встроить в бензопилу Raspberry Pi и экранчик, но разве оно того не стоило, это же так в духе самого DOOM.
1 DOOM
Да, вы всё правильно поняли, DOOM запустили внутри DOOM, чтобы вы могли играть в DOOM пока играете в DOOM.
В моде GZDoom, вы можете найти игровой автомат в котором собственно будет Doom.
И на заключение, DOOM портируют не только на различные устройства, но в том числе и на более современные игровые движки. Одна группа энтузиастов например занимается портированием DOOM на движок Unity и выглядит это вот так
Другая группа пишет собственный движок который открывает возможность для желающих разрабатывать собственные модификаций для DOOM, одной из самых известных на данный момент является Brutal DOOM и это в свою очередь выглядит вот так:
Почему разработчики любят запускать Doom на разном железе
Потому что это очень просто.
Первая версия Doom появилась, страшно сказать, в 1993 году. Тогда она работала только на ПК. Через год в неё можно было играть на любой приставке, а потом её стали запускать везде, где есть хоть какой-то экран и процессор. Разработчики и программисты просто развлекаются тем, что запускают Doom на том железе, где не предполагалось никаких игр: на фотоаппаратах, рекламных щитах, аппаратах УЗИ, холодильниках и бензопилах.
На то есть причина. Для своего времени Doom была технологическим чудом: с инженерной точки зрения это очень умно сделанная игра, в ней применяются невообразимые для современного программиста оптимизации, и всё ради того, чтобы обойти ограничения древнего компьютерного железа.
Запустить Doom на чём-то сегодня — это как взобраться на Эверест. В целом низачем не нужно, но очень почётно и интересно.
Размер
Игры, подобные Doom, обычно занимали 15–20 мегабайт, но разработчики из id Software смогли уместить её в 4 мегабайта. Сюда входят:
Если вам интересно, как это могло быть сделано, почитайте наш разбор о том, как пишут подобные игры.
Благодаря размеру в 4 МБ Doom можно записать почти на любой компьютер. Напомним, это было время, когда у людей были жёсткие диски по 100–500 МБ.
Ненастоящее 3D
До Doom игры по большей части были двумерными по сути и смыслу: ты прыгал с платформы на платформу, ходил по плоскости вправо-влево. Могла быть какая-то имитация глубины, как в каких-нибудь винтажных «Черепашках-ниндзя», но всё равно ощущался плоский мир. Были, конечно, и трёхмерные игры, но выглядели они…
Doom впервые замахнулся на то, что сейчас бы назвали «иммерсивным 3D-шутером». Была цель сделать игру, в которую ты погружён от первого лица, и при этом чтобы она была очень быстрой по геймплею. Нужна была нормальная трёхмерная графика.
Но на Пентиумах тех лет трёхмерная графика страшно тормозила. Её можно было рисовать в режиме слайд-шоу, но на динамичный экшен мощности не хватало.
Отсюда первая крутейшая оптимизация трёхмерной графики в Doom: это не трёхмерная графика. Здесь нет высоты. Вы видите высоту на экране, но это всего лишь хитрая программистская оптимизация. Главный герой может смотреть только вправо-влево, но у него нет движения вверх-вниз. Все объекты в Doom находятся на одном уровне с главным героем.
Вы заметите, что главный герой при ходьбе как бы качается вверх-вниз. При этом его точка зрения всегда ровно по центру, взгляд героя всегда устремлён в горизонт.
Для примера, сравните это с уже подлинно трёхмерной игрой Quake, которая вышла тремя годами позднее. Тут уже и камера смотрит во всех направлениях, и враги — это трёхмерные модели:
Для компьютера это псевдо-3D значит, что не нужно считать искажения от движения камеры вверх. Достаточно просто считать перспективные искажения стен и пола, применяя менее ресурсоёмкую математику.
На экране это почти незаметно: благодаря свету, тональной перспективе и текстурам игроку кажется, что всё по-настоящему трёхмерно. Но в игре у главного героя не получается пройти под летающими монстрами или пролезть под препятствием.
Но постойте: а как же лестницы? А шутка в том, что ступеньки, кубы и прочие выступы — это фактически отдельные комнаты со своей высотой пола, но без стен. Всё, что внутри этой комнаты, располагается на одной высоте, поэтому когда герой забирается на ступеньку, по факту он просто попадает в другую комнату, где всё снова становится с ним одной высоты.
К чему это приводит:
С — совместимость
Почти весь движок Doom написан на C, а это значит, что его можно портировать и перекомпилировать для других платформ. Штука в том, что C — очень гибкий и мощный язык, который не зависит от платформы, главное, чтобы был нужный компилятор.
Но оставалась ещё та часть, которая в оригинальной игре была написана на ассемблере, и при переносе с ней могли быть проблемы, так как ассемблер зависит от конкретного процессора. Всё решилось, когда разработчики переносили игру на приставки Nintendo и заменили эти фрагменты кодом на C.
После этого Doom можно было портировать на что угодно, если для этого железа есть C-компилятор.
Автоматическая оптимизация на слабом железе
У движка Doom есть классная особенность: он сам определяет мощность процессора и возможности монитора, чтобы графика работала быстро даже на слабых машинах.
Устроено это так: если процессор слабый, то текстуры упрощаются в два раза, если совсем слабы — в четыре раза. Каждая текстура накладывается на одну сторону виртуального куба, у которой есть длина и ширина. Так как текстуры упрощаются в два раза по каждому измерению, получается, что на одну сторону тратится в 2 × 2 = 4 раза меньше ресурсов, а на весь куб — в 24 раза меньше.
С монитором то же самое: если он может отображать только 8 цветов, то процессор не будет вычислять оттенки красного, например. Вместо этого он всю палитру приведёт к цветам монитора и будет работать с ними, что даст существенный прирост производительности.
Сюжет и драматургия
В Doom были и геймдизайнерские новшества:
И такой момент: первые уровни Doom показали бесплатно в 1992 году, а потом уже в 1993 выпустили полную платную версию. Естественно, все её дико захотели. Free-to-play родился где-то вместе с Doom.
Великая игра, что говорить. Даже сейчас играется на ура. Спасибо тебе, Doom, за наше счастливое детство.
Портируем DOOM на serverless-платформу
Благодаря своей открытой кодовой базе и чистым абстракциям DOOM компании id Software стал одной из самых портируемых в истории игр. Мне показалось, что это идеальный проект для портирования на платформу Compute@Edge, созданную в нашей вычислительной serverless-среде, для экспериментов с различными способами применения нашего продукта.
Демонстрация интерактивной работы DOOM на Compute@Edge позволила бы расширить границы производительности продукта и показать его удивительные возможности. В этой статье я расскажу, как мы этого добились.
Краткая история DOOM
DOOM — это игра, разработанная в 1993 году id software и выпущенная в декабре того же года. Id software зарабатывала на жизнь разработкой высококачественных 2D-игр, но создав в 1992 году Wolfenstein, а в следующем году DOOM, компания совершила исторический шаг в 3D, воспользовавшись быстрым прогрессом PC для расширения границ отрасли.
Исходники DOOM были открыты в 1997 году, в файле README было написано «Портируйте его на свою любимую операционную систему». Многие фанаты игры так и поступили — DOOM портировали на сотни систем, от самых очевидных до самых неизвестных. Будучи фанатом DOOM, я захотел проверить потенциал Compute@Edge, поэтому портировал эту культовую игру на платформу.
Примечание: Game Engine Black Book Фабьена Санглара — потрясающий ресурс, к которому я часто обращался в процессе работы над проектом. Эта и другая его книга о Wolfenstein являются подробным анализом ключевых моментов истории разработки видеоигр, к тому же очень увлекательны и познавательны.
Портирование
При портировании DOOM я решил использовать двухэтапный процесс:
Общий код
Запуск DOOM без рендеринга и звука на Compute@Edge был достаточно простой задачей. В кодовой базе каждое имя функции имеет префиксы, и все специфические для реализации функции имеют префикс «I_», поэтому было довольно легко пройтись по кодовой базе и удалить их из компиляции. Закончив с этим, я использовал wasi-sdk чтобы сделать целевым двоичный файл Wasm. WebAssembly спроектирован так, чтобы без особых проблем компилировать нативный код, поэтому это изменение было очень простым.
Мне нужно было внести изменения в двоичный файл WebAssembly, потому что DOOM разрабатывался во времена 32-битных вычислений. В коде есть места, где предполагается, что указатели имеют размер 4 байта, что на тот момент было вполне разумным выбором. Данные в DOOM загружаются из файла, содержащего все ресурсы, созданные командой разработки и объединённые в один файл в момент релиза. Эти данные загружаются непосредственно в память, и сопоставляются с представляющей их внутриигровой структурой C. Если в этих структурах задействуются указатели, то загрузка данных в 64-битной среде приведёт к неправильному наложению данных на структуру и к неожиданному поведению. Эти проблемы выявить было довольно легко, и первоначально они приводили к достаточно очевидным сбоям.
Изменения в игровом цикле
Чтобы иметь возможность запускать общий код на Compute@Edge, мне нужно было отрефакторить традиционный игровой цикл, используемый в DOOM. Обычно игра инициализируется, а затем выполняется в бесконечном цикле, постоянно совершая с нужной частотой такты «ввод->симуляция->вывод», получая ввод от таких локальных устройств ввода, как клавиатура, мышь или контроллер, и выводя видео со звуком. Однако на Compute@Edge подобный процесс был бы исключён платформой, потому что задача инстанса заключается в запуске, выполнении некой работы, а затем возврате к вызывающей стороне. Поэтому я полностью избавился от цикла и изменил инстанс так, чтобы он выполнял только один кадр игры.
При выполнении в цикле полученный результат выглядит примерно так:
Ниже я подробнее расскажу о каждом из этих этапов.
Вывод
В видеоиграх память, содержащая отображаемое игроку готовое изображение, называется буфером кадров. В современных играх буфер кадров часто создаётся специализированным оборудованием GPU, так как готовое изображение часто является результатом выполнения множества этапов конвейера GPU. Однако в 1993 году рендеринг выполнялся программно, и в DOOM готовый буфер был доступен программисту как простой массив C. Такая схема упростила портирование DOOM на новые платформы, так как предоставляла разработчикам простую и понятную отправную точку для начала работы.
В случае с Compute@Edge я хотел возвращать буфер кадров в браузер игрока, где его можно отобразить. Для этого было достаточно использовать API C для написания буфера кадров в теле ответа, а затем отправлять это тело вниз по потоку:
Когда запущенный в браузере клиент получает http-ответ от Compute@Edge, он парсит из него буфер кадров и рендерит его в браузере.
Состояние
Для воспроизведения игрового цикла в этой новой системе нам нужно куда-то сохранять состояние, чтобы при вызове Compute@Edge для идущих по порядку кадров мы могли сообщать новому инстансу, где находимся в игре. Мне удалось воспользоваться присутствующими в игре функциями сохранения-загрузки, которые изначально предоставляли игроку возможность сохранять состояние игры на диск, а затем загружать игру и продолжать игровой процесс.
Я использовал для состояния тот же механизм, что и для буфера кадров: в конце кадра игры я вызываю систему сохранения, чтобы получить буфер, описывающий состояние игры, а затем присоединяю его к буферу кадров, при возврате http-ответа вызывающей стороне.
Наряду с этим изменением был модифицирован и клиент, теперь он разделяет буфер кадров и состояние, и хранит состояние локально, а буфер кадров отображает в браузере. Когда он в следующий раз отправляет запрос к Compute@Edge, то передаёт в теле запроса состояние, которое инстанс Compute@Edge может считать из тела запроса и передать игре следующим образом:
Если мы вычислим кадр игры, то он будет выглядеть так, как будто он произошёл такт спустя после сохранения состояния игры.
Далее нам нужно реализовать ввод пользователя, чтобы в игру действительно можно было играть! Система ввода DOOM абстрагирована при помощи концепции событий ввода. Например, «игрок нажал клавишу W» или «игрок переместил мышь по X». При помощи слушателей событий Javascript (event listeners) мы достаточно легко можем генерировать в браузере события ввода, сопоставляемые с теми, которые ожидает DOOM:
Я отправляю события ввода вместе с состоянием, когда совершаю http-запрос к Compute@Edge. Затем инстанс парсит их в вид, который можно передать в движок игры перед вычислением кадра.
Оптимизации
Первая работающая версия этого демо совершала весь путь одного такта примерно за 200 мс. Для интерактивной игры это неприемлемо. Обычно игры вычисляют кадр за 33 мс, что аналогично 30FPS, или за 16 мс, что аналогично 60FPS. Учитывая, что задержки будут нетривиальной частью частоты обновлений, я решил, что стоит стремиться к 50 мс, то есть к четырёхкратному улучшению.
Многие оптимизации, которые мне удалось реализовать, были связаны с переходом от выполнения непрерывного игрового цикла к вычислению отдельного кадра. Многие системы игры построены на таком принципе, что каждый такт является дельтой предыдущего кадра. Игра хранит состояние, которое не записывается в сохранение игры, а используется в каждом кадре для принятия решений. Многие такие системы требовали настройки и для обеспечения правильной работы, и из соображений производительности. Эти системы лучше всего работали в ситуации, когда они находятся не в первом кадре и многие переменные и состояние уже инициализированы.
При запуске игра выполняет множество предварительных расчётов, в основном связанных с тригонометрией для преобразований из видового пространства в пространство мира. Этим предварительно вычисляемым таблицам также требуется информация о разрешении экрана игры, и именно поэтому они вычисляются во время выполнения. В своём проекте я сделал разрешение рендеринга неизменным, поэтому смог просто встроить готовые таблицы в скомпилированный двоичный файл, чтобы не выполнять в каждом кадре эти вычисления.
Мне удалось добиться, чтобы игра работала со скоростью 50-75 мс на такт. Можно поработать ещё, чтобы приблизиться к исходным показателям DOOM, но такие оптимизации показали, что мы можем итеративно работать с подобными проектами на Compute@Edge.
Выводы
Это была моя первая проба Compute@Edge, и я не знал, чего ждать от платформы с точки зрения отладки и итеративной работы. Платформа активно и непрерывно совершенствуется, и за три недели работы над проектом я увидел эти улучшения. В частности я хотел бы упомянуть Log Tailing, позволивший мне почти в реальном времени просматривать выводимую в DOOM информацию. При работе с довольно непрозрачной программой на C, особенно до того, как мне удалось добиться экранного рендеринга, просмотр этих выводимых данных был неоценим при отладке. В целом развёртывание на Compute@Edge оказалось похожим, например, на работу с традиционной видеоигровой консолью.
Честно говоря, она не была бы идеальным решением для запуска игры реального времени, требующей обновлений с точными таймингами. От подобного способа запуска игры не удастся получить никакой реальной выгоды. Задачей этого эксперимента было расширение границ возможного для платформы, создание реального демо для открытия и демонстрации потенциала. Разумеется, эту платформу в некоторых случаях можно использовать для видеоигр, и мы продолжаем исследовать способы использования продукта Compute@Edge в различных отраслях.
На правах рекламы
Мощные VDS с процессорами AMD EPYC для разработчиков. Частота ядра CPU до 3.4 GHz. Максимальная конфигурация позволит оторваться на полную — 128 ядер CPU, 512 ГБ RAM, 4000 ГБ NVMe.