Doom на Hasselblad X2D 100C стал не просто очередной шуткой из серии «запустили Doom на всём, что включается». Разработчик Радиум Ван заставил среднеформатную камеру с 100-мегапиксельным сенсором работать как игровое устройство: кнопка спуска стреляет, свайпы поворачивают персонажа, а штатный динамик воспроизводит эффекты. Для разработчиков это наглядный разбор того, как можно встроить сторонний движок в закрытый интерфейс устройства, не перепрошивая его целиком.
Эксперимент Ван проводил на Hasselblad X2D 100C первого поколения с прошивкой 4.2.0 сборки 24849, сообщает Habr / Новости. Камера вышла в продажу в 2022 году и на старте стоила $8200 без объектива. Внутри устройства разработчик обнаружил 64-разрядную ARM-платформу, Android API 28, Qt 6.4.1 и Wayland. Это не означает, что камера внезапно превратилась в универсальный Android-планшет: штатная система рассчитана на съёмку и обработку кадров, а не на запуск сторонних приложений. Именно поэтому основной технический интерес здесь не в самой игре, а в способе её интеграции.
У Hasselblad Qt Quick встроен прямо в приложение камеры, но отдельной библиотеки, из которой можно штатно запускать свои программы, в системе нет. Ван обошёл ограничение, разделив проект на две части. Сам игровой движок работает отдельно, а пользовательский интерфейс оформлен как дополнительная страница внутри родного приложения камеры. Чтобы подключить загрузчик этой страницы, разработчик подменил скомпилированный QML-файл в памяти процесса. Прошивку при этом не редактировали — важная деталь для тех, кто изучает внутренности потребительских устройств, но не хочет сразу превращать дорогую технику в предмет для восстановления из сервисного режима.
За основу взят doomgeneric — порт Doom, специально спроектированный так, чтобы переносить его на нестандартные платформы через небольшой слой адаптации. Ван написал на C адаптер для вывода изображения, обработки ввода и управления игровым циклом, а затем собрал движок Zig в статический исполняемый файл под ARM64. Получилась характерная инженерная конструкция: не полноценная игровая оболочка внутри камеры, а два процесса, которые аккуратно обмениваются данными через доступные механизмы среды.
Кадры передаются через файлы в оперативной памяти. Функция DG_DrawFrame() сохраняет изображение с базовым разрешением 320 × 200 пикселей во временный BMP-файл, после чего переименовывает его в frame.bmp. Переименование здесь играет роль простого барьера: интерфейс не должен прочитать файл, пока тот ещё записывается. QML-страница проверяет номер кадра, загружает новое изображение и растягивает его до формата 4:3. Таймер срабатывает раз в 30 мс. Это не путь к рекордной производительности, зато практичный способ связать движок и UI там, где нет готового IPC-слоя или желания глубоко вмешиваться в существующее приложение.
Управление устроено зеркально: интерфейс сохраняет состояния виртуальных клавиш и смещения свайпов, а движок преобразует их в события Doom. Сенсорный экран поддерживает мультитач, поэтому можно одновременно двигаться и менять направление обзора. Спусковая кнопка камеры отвечает за выстрел — редкий случай, когда эргономика фототехники буквально помогает пройти уровень. Встроенный динамик тоже задействован: модуль читает звуковые эффекты из WAD-файла и формирует 16-битный стереопоток с частотой 48 кГц. Поток через буфер в общей памяти поступает процессу, который напрямую взаимодействует с динамиком. Музыка пока не поддерживается, доступны только эффекты.
Doom на Hasselblad полезен как компактный кейс для embedded-разработки. Он показывает несколько вполне прикладных приёмов: использование имеющегося UI-фреймворка вместо написания собственной оболочки, отделение платформонезависимой логики от тонкого адаптера, статическая сборка под целевую архитектуру и обмен данными через простые атомарные операции с файлами. Для корпоративного продукта подобная схема, конечно, потребовала бы нормального протокола IPC, обработки ошибок и контроля ресурсов. Но в исследовательском прототипе она быстро доказывает главное: устройство можно расширить, даже если его штатный софт к этому не приглашал.
Автор опубликовал исходный код проекта по лицензии GPL, однако готового установщика для версии Doom под эту камеру нет. Поэтому владельцам X2D не стоит воспринимать эксперимент как инструкцию по добавлению игрового режима между серийной съёмкой и просмотром кадров. Зато история хорошо иллюстрирует устойчивый тренд: специализированные устройства всё чаще оказываются вычислительными платформами с экраном, ARM-процессором и сложным программным стеком. Вопрос уже не в том, можно ли запустить на них Doom, а в том, какие полезные сценарии разработчики сумеют извлечь из тех же возможностей без риска для самого устройства.