
Да, вы уже видели заголовки. DOOM теперь запускается и в MS Paint. Но в отличие от популярных мемов «DOOM работает на чём угодно», Paint не исполняет игру. Встроенное приложение для рисования в Windows 11 — это всего лишь холст, на который игра выводит картинку.
Марк Руссинович, технический директор Microsoft Azure, собрал и опубликовал проект под названием DoomPaint на GitHub. Сам он поясняет: «Paint отображает игру, но не производит вычислений. Paint вообще ничего не считает. Никогда не считал. В этом и шутка».
В проекте Руссиновича используется самый настоящий движок ViZDoom, каждый кадр рендерится в безоконном режиме, а затем через системный буфер обмена Windows вставляется на холст Paint.
Что ещё интереснее — есть полноценное управление с клавиатуры, работают звуковые эффекты и звучит оригинальный MIDI-саундтрек, а частота кадров колеблется от «родных» 35 FPS DOOM до того, что Руссинович мягко называет «как в электронных таблицах».

Мы изучили репозиторий на GitHub и выяснили, как системный буфер обмена, из всех возможных инструментов, умудряется передавать игровой движок в реальном времени без сбоев.
Как запустить DOOM в Microsoft Paint
-
Перейдите на страницу DoomPaint на GitHub и скачайте проект в виде ZIP-архива либо клонируйте репозиторий, если пользуетесь Git.
-
На компьютере должен быть установлен Python, так как проект его использует.
-
Распакуйте папку и запустите двойным щелчком
run.bat. -
При первом запуске скрипт создаст виртуальное окружение и автоматически установит все зависимости — просто дождитесь окончания.
-
По окончании настройки Microsoft Paint откроется сам.
-
Держите Paint в фокусе и сразу начинайте играть.
Управление по умолчанию:
-
W / S или ↑ / ↓ — движение вперёд и назад
-
A / D или ← / → — поворот
-
Q / E — шаг в сторону
-
Ctrl или F — стрельба
-
Пробел — использование, открывание дверей
-
Shift — бег
-
F12 — выход
Чем DoomPaint отличается от предыдущих попыток «DOOM в Paint»
В отличие от того, что намекали заголовки последних пары дней, DoomPaint — не первая попытка вывести DOOM на холст Paint, однако ранние эксперименты обычно запускали игру в отдельном окне, а в Paint лишь зеркально транслировали или копировали это окно через захват экрана. Фактически игрок проходил DOOM как обычно и наблюдал копию его картинки где-то ещё.
DoomPaint работает иначе. Второго окна с Doom здесь нет. Холст Paint — единственный «дисплей», доступный игре, и каждое нажатие клавиши обрабатывается именно через Paint.
Движок — ViZDoom, форк ZDoom, созданный для задач искусственного интеллекта и обучения с подкреплением. Именно поэтому он умеет рендерить без открытия окна. Обёртка Руссиновича прячет это окно сразу после создания, до того, как оно успеет промелькнуть на экране. Файл shareware DOOM1.WAD содержит первый эпизод игры — вместе с уровнями и оригинальной музыкой Бобби Принса. Карты последующих эпизодов заменены на Freedoom, WAD под лицензией BSD, поскольку id Software так и не сделала остальную часть игры свободно распространяемой (даже спустя все эти годы!)
Разрешение по умолчанию — 640×400 при частоте до 35 кадров в секунду. Если снизить до 320×200 (настоящее родное разрешение DOOM образца 1993 года), частота увеличится.
В просмотренной нами записи работы проекта видно, как вставленный кадр плавает внутри стандартных маркеров выделения Paint. Снизу — классический HUD DOOM со здоровьем, патронами, бронёй и лицом персонажа, а наверху всё так же виднеется лента Paint с кнопкой Copilot.
Управление и настройка
-
Перемещение — WASD или стрелки, страф — Q и E, а выстрел назначен и на Ctrl, и на F. Это сознательное дублирование, потому что сторонние утилиты с перехватом клавиатуры, вроде PowerToys, могут «съесть» нажатие Ctrl раньше, чем его обработает игра.
-
Любопытно, но, впрочем, ожидаемо, что отмена действия (Ctrl+Z) работает как перемотка назад. Каждый вставленный кадр — это отдельный шаг в истории Paint. Поэтому если персонаж погиб, несколько нажатий Ctrl+Z его «оживляют».
-
Сохранение файла в любой момент создаёт PNG с тем кадром, на который вы смотрите. Paint понятия не имеет, что он транслирует игру 1993 года!
-
Для работы требуется Python, так как bat-файл собирает виртуальное окружение и автоматически ставит зависимости.
-
Покупать DOOM для первого эпизода не нужно. Но если поместить в папку wad файлы doom.wad или doom2.wad, на более поздних картах зазвучит и оригинальный саундтрек.
Как Марк Руссинович заставил DOOM работать внутри Paint
На первый взгляд схема проста: каждый кадр отправляется в буфер обмена и вставляется. Однако десятки таких операций в секунду без падений Paint — задача нетривиальная.

Состояние гонки при работе с буфером обмена, едва не погубившее проект
Paint читает буфер обмена асинхронно, по своему графику. Очевидный подход — очистить буфер и записать новые данные изображения с помощью стандартных функций Windows EmptyClipboard и SetClipboardData.
Но если делать это десятки раз в секунду, рано или поздно буфер будет очищен как раз в тот момент, когда Paint ещё читает предыдущий кадр. Данные пропадут у Paint из-под рук, и он выдаст модальное окно «Невозможно выполнить операцию», вставка остановится, а игра зависнет.
Решение Руссиновича, обнаруженное нами в файле проекта clipserve.py, — перестать перезаписывать буфер обмена. Windows позволяет приложению владеть буфером обмена через объект данных OLE со счётчиком ссылок, для этого используется OleSetClipboard с пользовательским IDataObject. Байты при каждом запросе отдаются через вызов GetData.
DoomPaint создаёт один такой объект на всю сессию и обновляет байты текущего кадра на месте, не очищая и не перезаписывая буфер обмена. Поскольку объект работает со счётчиком ссылок, уже начатое чтение останется корректным, и состояние гонки больше не возникает. Каждый вызов GetData также играет роль сигнала «кадр получен», по которому игра синхронизирует темп: следующий кадр отрисовывается только после того, как Paint подтвердит, что забрал предыдущий.
Как организована вставка без перехвата нажатий клавиш
DoomPaint при старте тестирует два способа запуска вставки и выбирает тот, который работает на конкретной версии Paint. Предпочтительный метод — послать синтетическое нажатие Ctrl+V напрямую. Оно не открывает меню и ничем не рискует перехватить игровые клавиши.
Некоторые сборки Paint, однако, молча проглатывают синтетические Ctrl+V. В этом случае проект откатывается на запасной вариант — вызов команды «Вставить» через меню UI Automation. Это медленнее, но надёжнее, хотя и приводит к краткому появлению меню «Правка».
Вставленный кадр появляется в Paint как плавающее выделение, что и видно на записи работы проекта.
Вставка следующего кадра автоматически фиксирует предыдущее плавающее выделение. Именно так каждый кадр становится отдельным постоянным шагом в истории отмен Paint, без необходимости отдельного коммита или сведения слоёв со стороны Руссиновича.
Чтобы игровые клавиши случайно не взаимодействовали с интерфейсом Paint, потребовался низкоуровневый Windows-хук клавиатуры WH_KEYBOARD_LL. Он перехватывает каждое нажатие игровой клавиши, пока Paint в фокусе, и не пропускает его к Paint. Без такого хука случайное нажатие стрелки могло бы закрыть открытое меню вставки и на несколько секунд прервать доставку кадров.
Как DoomPaint издаёт звуки внутри MS Paint
Звуковые эффекты поступают из ViZDoom через OpenAL, причём Руссинович заменил штатную библиотеку на более свежую OpenAL-Soft 1.24. Старая версия, включённая в состав ViZDoom, не умела переключаться на новое аудиоустройство по умолчанию во время сеанса, например, при подключении гарнитуры.
Для музыки — ViZDoom отказался от встроенного воспроизведения музыки ZDoom. Поэтому отдельный модуль извлекает музыкальные данные прямо из WAD-файла, при необходимости конвертирует формат MUS из DOOM в MIDI и зацикливает их через MIDI-секвенсор Windows.
Проект также умеет самодиагностировать недетерминированную проблему с Windows Audio, когда устройство открывается и вроде бы работает, но выдаёт абсолютную тишину. DoomPaint сбрасывает звуковую систему один раз при запуске, а затем мониторит вывод во время игры и делает повторный сброс через несколько секунд, если стрельба не сопровождается звуками.
Fable 5 участвовала в разработке, и это показывает, куда движется индустрия
В посте на LinkedIn, анонсирующем проект, Руссинович написал, что использовал Claude Fable 5 в серьёзных исследовательских задачах и счёл модель заметным шагом вперёд по сравнению с Opus 4.8, добавив, что этот забавный Doom-в-Paint проект он собрал с ней же в качестве развлечения тем же утром. История коммитов DoomPaint на GitHub действительно содержит реальный вклад, приписанный инструментам AI-кодирования.
Несмотря на шуточный характер, при создании DoomPaint пришлось решать настоящую проблему гонки состояний в Windows, реверсинжинирить недокументированное поведение буфера обмена Paint и обходить ошибку аудиодрайвера. И всё это вышло из рук сотрудника Microsoft, который в свободное время рассматривал AI-модель как достаточно быстрый инструмент для прототипирования серьёзной системной работы.
DoomPaint — небольшой и нарочито забавный пример того тренда, на который Microsoft ставит вместе с развитием Windows в целом. Речь о том, что AI-агенты начинают выполнять всё более серьёзную инженерную работу, и Юсуф Мехди пообещал продвигать это направление в свой последний год в компании перед уходом.






Пока нет комментариев. Будьте первым!