Легендарный Doom смогли запустить в PDF в браузере

В основе этого оригинального порта лежит проект doomgeneric

2 мин.
Легендарный Doom смогли запустить в PDF в браузере

Школьник-разработчик ading2210 сумел перенести первую часть легендарного Doom на новую, весьма необычную платформу — теперь в культовый шутер можно сыграть прямо через PDF-файл. В основе этого оригинального порта лежит проект doomgeneric, который значительно упрощает адаптацию игры для нестандартных сред.

По словам энтузиаста, многие привыкли думать, что PDF-файлы предназначены исключительно для работы с текстом и статическими изображениями, но этот формат скрывает в себе куда больше возможностей. Оказывается, он поддерживает JavaScript со своей собственной библиотекой стандартных функций. Современные браузеры, к примеру, Chromium и Firefox, частично реализуют эту поддержку в своих PDF-движках. Но доступный в них функционал сильно урезан в целях безопасности.

Полный же набор возможностей JavaScript в PDF-файлах был реализован лишь в Adobe Acrobat. Среди них встречаются действительно неожиданные вещи, в том числе поддержка 3D-рендеринга, выполнение HTTP-запросов и даже возможность определять все мониторы, подключённые к системе. В браузерах же сохранилась лишь малая часть этого функционала, что всё же позволяет выполнять любые вычисления, хоть и с ограниченными возможностями для работы с вводом и выводом данных.

Видео в Telegram: https://t.me/applespbevent_video/8

Для запуска Doom внутри PDF разработчик воспользовался старой версией Emscripten, компилирующей код C в asm.js, а не WebAssembly. Основной задачей стало обеспечение корректного ввода и вывода (это наиболее важные компоненты для работы игры).

С обработкой ввода всё оказалось довольно просто, потому что движок PDF в Chromium поддерживает текстовые поля и кнопки. Но передача изображения оказалась куда сложнее. Ading2210 отметил, что ранее встречал интерактивные проекты на PDF, использующие текстовые поля в качестве отдельных пикселей, но для Doom с его разрешением 320×200 такой метод был бы совершенно непригоден. Для обновления каждого кадра пришлось бы изменять десятки тысяч текстовых элементов, что привело бы к катастрофическому падению производительности.

Вместо этого он нашёл более эффективный способ, в рамках которого каждую строку изображения заменяет одно текстовое поле, в котором буквы ASCII формируют графику. Такой подход позволил добиться шестицветного монохромного изображения, достаточного для комфортной игры. Хотя обновление экрана занимает около 80 мс на кадр, итоговая производительность остаётся на приемлемом уровне.

Энтузиаст реализовал простую консоль, отображающую вывод stdout из Emscripten. Для этого использовались 25 вложенных текстовых полей, создающих эффект прокрутки. Это нововведение упростило отладку, поскольку стандартная консольная печать (console.println) в PDF-документах браузеров попросту не реализована.


Ещё по теме:

Мы в Telegram, на Дзен, в Google News и YouTube