Этот сайт — моя персональная записная книжка. Интересна мне, по большей части, история, своя жизнь и немного программирование.

DoomPDF

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

Но «Дум», запущенный внутри PDF-файла, меня чертовски удивил! Не то, чтобы я не знал, что это возможно — в конце-концов, PDF сам по себе программный файл (там внутри язык программирования PostScript), но я как-то даже и не думал о такой возможности.

Вы попробуйте, работает даже внутри браузера!

Правда, в данном случае PostScript почти не использовался. Всё дело в том, что внутри PDF есть возможность использовать ещё и JavaScript. Причём, в случае Adobe Acrobat, доступны, например, такие, сомнительные для PDF возможности, как 3Д-графика или HTTP-запросы.

В просмотрщиках PDF современных браузеров поддержка JavaScript тоже есть, правда она сильно ограничена по функционалу. Тем не менее, для запуска «Дума» хватило и этого.

Чтобы запустить «Дум» внутри PDF, использовался старый Emscripten, который компилирует код на Си в asm.js (это такое подмножество JavaScript), вместо более привычного WebAssembly. Но этого недостаточно — нужно было придумать, как принимать ввод с клавиатуры и отображать графику. Это оказалось не таким уж и простым. К счастью, в браузерах PDF-движки поддерживают текстовые поля и кнопки, что и было использовано для ввода.

С графикой возникли следующие проблемы. Речь идет о разрешении 320×200 пикселей, что означает, что если бы использовались обычные текстовые поля для каждого пикселя, пришлось бы обновлять тысячи полей на каждый кадр. В общем, так бы вы никогда не поиграли в «Дум». Вместо этого автор решил использовать одно текстовое поле на каждую строку экрана и обновлять их с помощью ASCII-символов. Простой, но довольно эффективный способ, который дает в итоге монохромную картинку с шестью цветами. Конечно, такой способ тоже не даёт плавного рендера картинки, но играть всё равно довольно комфортно!

2 комментария
Макс 1 мес

Проблема с разрешением дума при портировании и у меня возникала. На Ютубе у меня есть видос, где изображение передается по радиоканалу, а формирует изображение микросхема osd на дроне. Осд — это текстовая техническая инфа поверх растрового изображения. Проблема в том что она текстовая и что конкретно в самых популярных осд разрешение по знакоместам минимальное. Что-то типа 40 на 20 (точно не помню). Перепрограммировал знакогенератор и сделал чтоб каждый символ кодировал небольшой квадратик. В итоге увеличи разрешение в 2*4 в 8 раз. Что все равно мало ибо ещё и монохром, но в динамике можно было понять что играешь в дум

Евгений Степанищев 1 мес

А где можно посмотреть-то?

Сергей Васильев 14 дн

Относительно недавно встречал хороший обзор от shiru8bit
Doom практически на всём
https://habr.com/ru/companies/ruvds/articles/821281/

А ещё нашёл сайт, на котором собирают такие нестандартные способы запуска
https://canitrundoom.org/

Вдруг пригодится.

Евгений Степанищев 14 дн

Очень крутая статья на «Хабре», за неё спасибо, я её пропустил. Второй сайт посмотрю попозже.