Очень интересный проект от Epic Games — визуальный отладчик под x64, работающий с файлами PDB. Оказалось, что отлично совместим с D, так как windows-версии компиляторов как раз и выдают отладочную инфу в этом формате. Показывает не просто функцию, в которой произошло исключение, но и прямо конкретное его место в коде.
d
Итоги 2025 года
Традиционно подвожу итоги за уходящий год. Выдалось очень много свободного времени для хобби-проектов — я не только хорошо поработал над движком, но и изучил множество новых для себя технологий.
- Перенес почти все свои онлайн-ресурсы на новый сервер. Блог переехал на новый домен и был переименован в PixelPerfect Blog. Заодно я добавил некоторые оптимизации, за счет которых он теперь работает заметно быстрее;
- Выпустил множество версий Dagon, от 0.19 до 0.36. Я перешел на новый итеративный принцип обновлений: теперь релизы выходят по мере добавления небольших наборов фич, вместо того, чтобы по полгода накапливать много изменений. В этом году движок был очень серьезно обновлен, перечислю тут лишь наиболее важное.
- Состоялся переход на OpenGL 4.3;
- Добавлена поддержка вычислительных шейдеров;
- Появилась поддержка GPU-скиннинга и анимированных моделей glTF;
- Реализована поддержка HiDPI;
- Реализовано расширение для работы с устройствами виртуальной реальности посредством OpenVR;
- В систему событий добавлена многопоточность с асинхронным обменом сообщениями между потоками;
- Улучшена система загрузки текстур: изображения теперь загружаются через библиотеку SDL2_Image, что обеспечивает поддержку новых форматов — WebP, AVIF, SVG и многих других. Также реализована поддержка текстур в формате KTX/KTX2 с транскодированием из Basis Universal в различные профили аппаратного сжатия. Добавлена поддержка анизотропной фильтрации текстур;
- Встроенный звуковой движок на основе SoLoud;
- Поддержка видео на основе libVLC;
- Поддержка теней для позиционных источников света (PSM и DPSM);
- Объемное рассеивание для позиционных источников света;
- Префильтрация кубических карт;
- Бокс-проекция для зондов окружения;
- Упрощенный рендер
SimpleRendererдля казуальных игр и ретро-графики; - Шейдер океана;
- Шейдер луж для ландшафта;
- Поддержка Matcap-проекций для текстур;
- Встроенная система проверки столкновений;
- Логгер;
- Простой GUI-тулкит;
- Поддержка нескольких игровых контроллеров;
- Ввод с Wintab-совместимых графических планшетов с учетом силы нажатия;
- Поддержка локализации приложений;
- Обновился сайт Dagon. Также у проекта наконец-то появилась онлайн-документация.
- Выпустил dlib 1.3.1, 1.3.2, 1.3.3 и 1.4.0;
- Написал биндинги к Vulkan, GLSLang, SPIRV-Cross, PhysFS. Все мои биндинги теперь живут в GitHub-организации DLangGamedev;
- Значительно обновил Chillwave Drive, демку физики автомобиля;
- Начал работу над GScript3, третьей версией моего скриптового языка;
- Форкнул Programmer’s Notepad, мой любимый текстовый редактор под Windows, и выпустил три новые версии, 2.5, 2.6 и 2.7, с несколькими важными изменениями по сравнению с оригиналом;
- Завершил работу над Xtreme3D 4.0.
Ну и, конечно, мой личный список интересных событий в мире D, Open Source и IT в целом:
- D используется в NASA! В этом году стало известно, что ПО для сбора данных в рамках миссии TRACERS было написано на D;
- D отметили в списке 10 самых быстрых языков программирования;
- Выход демо-версии The Art of Reflection, новой инди-игры на D;
- Выход в ранний доступ InZOI, next-gen симулятора жизни с реалистичной графикой — это первый в истории серьезный конкурент серии The Sims. Несмотря на сыроватый геймплей, игра поражает технологическим уровнем, особенно возможностями встроенных нейросетей для генерации моделей;
- GreenSock Animation Platform, самый мощный фреймворк браузерной анимации, стал полностью бесплатным. Я использую GSAP во всех своих коммерческих браузерных играх, так что новость для меня весьма радостная.
dlib 1.4.0
На днях вышла новая версия dlib — в нее вошли новые модули, которые изначально были частью Dagon:
- dlib.memory.arena — универсальный арена-аллокатор;
- dlib.container.spscqueue — SPSC-очередь для межпоточного взаимодействия;
- dlib.container.mappedlist — список с символьным доступом к элементам.
Также добавлена новая функция wrapAngle в dlib.math.utils. Matrix.isAffine, Matrix.inverse, Matrix.getColumn, Quaternion.toMatrix4x4, Quaternion.toMatrix3x3 помечены как const.
Dagon 0.36.0
Вышла новая версия движка — скорее всего, это последний релиз в 2025 году.
Добавлен новый тип событий EventType.HardwareSpecific для поддержки кастомных устройств ввода. Это событие не имеет определенной спецификации — данные события зависят от типа устройства. Обработчик события, onHardwareSpecificEvent, принимает индекс устройства, пользовательский код и непрозрачный указатель void*, по которому могут быть любые данные.
Добавлен EventManager.tmpHeap — арена-аллокатор для короткоживущих объектов (строк, массивов и структур, создаваемых для событий). Он сбрасывается, когда обработаны все пользовательские события.
EventDispatcher.onUserEvent теперь принимает вторым параметром указатель void* для пользовательских данных.
Реализован новый класс приложений BaseGame, который не включает рендер, но включает управление сценой. Game теперь наследует от него. Renderer теперь принимает объект Application в конструкторе для потенциально более глубокой интеграции рендера с приложением.
Добавлено новое расширение dagon:openvr, реализующее базовую поддержку гарнитур виртуальной реальности через API OpenVR. Поддерживается синхронизация с HMD и отправка текстур для вывода. К сожалению, стандартный рендер-пайплайн Dagon в настоящее время несовместим с VR, он для этого нуждается в серьезной переделке. Для тестов в расширении реализован простейший StereoRenderer. Подробности о том, как работать с VR, вскоре будут в отдельном посте.
Обновления
Dagon 0.35.0
Вышла новая версия движка, в которой добавлена поддержка таймеров (Application.setTimer и событие Timer) и новый модуль dagon.core.sysinfo, предоставляющий базовую информацию об аппаратно-программной платформе, на которой запущено приложение. Исправлен забагованный метод Properties.serialize, реализована поддержка текстур в формате WebP в загрузчике glTF (расширение EXT_texture_webp для текстур), добавлена поддержка Entity.blurMask в режиме прямого рендеринга. Объект NewtonMeshShape в расширении dagon:newton теперь можно создавать с передачей матрицы трансформации, которая применяется ко всем вершинам меша. Также добавлен Dagon Platform — комплект для разработки игр под Dagon на языке GScript3, о нем я расскажу подробнее в одном из следующих постов.
Chillwave Drive 0.2.0
Демка автомобильной физики значительно обновлена: улучшена графика, модель машины заменена на McLaren GT, исправлено множество мелких недочетов в симуляторе, благодаря чему демка теперь адекватно поддерживает заднеприводные авто, а также устранен баг в модели колес, который создавал лишнюю боковую силу в некоторых ситуациях. Я решил развивать Chillwave Drive в качестве полноценной игры, в связи с чем создал соответствующую страничку на сайте GameJolt. Вероятнее всего, это будет симкейд для расслабляющего вождения, в котором можно добавлять собственные машины, настраивать окружение и т.д.



Dagon 0.34.0
Очередной релиз движка. Добавлена поддержка нескольких контроллеров (до 4 включительно). Методы-обработчики событий контроллера в EventListener теперь принимают индекс устройства в качестве первого аргумента. Индексы начинаются с нуля, устройства добавляются в порядке их подключения в системе. EventListener.onControllerAdd теперь принимает GameInputDeviceType в качестве второго аргумента.
Обновлен менеджер ввода. Символ + в клавишных биндингах input.conf заменен на символ _ (то есть, теперь вместоright+ctrl нужно писать right_ctrl). Добавлены символические имена для биндингов мыши (в input.conf): mb_left, mb_middle, mb_right, mb_x1, mb_x2, ma_x, ma_y.
Приложение теперь автоматически определяет разрешение монитора в полноэкранном режиме, если windowWidth и windowHeight указаны как 0. Добавлена поддержка безрамочных окон. Добавлены новые опции settins.conf: localePath, window.maximized, window.minimized, window.borderless, fullscreenWindowed. В режиме fullscreenWindowed размер окна игнорируется, создается безрамочное окно размером с весь экран, как раньше с указанием нулевых windowWidth и windowHeight в оконном режиме.
Добавлена экспериментальная поддержка изотропного рассеивания для позиционных источников света, о котором я писал в предыдущем посте.
Исправлен и расширен класс LoadingScreen — добавлена поддержка HiDPI и фонового изображения.
Рассеивание для позиционных источников света
Добавил в Dagon фичу, которая редко встречается даже в AAA-движках — поддержку изотропного объемного рассеивания для позиционных источников света. До этого уже были т. н. «лучи Бога» для направленного света — более тяжелый анизотропный эффект, основанный на приближенной физике рассеивания света аэрозолями. Теперь, выставив light.scatteringEnable = true для любого источника света, можно сделать «свечение в тумане». Это похоже на постэффект glow, но отличается тем, что объемный свет рассчитывается геометрически, в трехмерном пространстве — поэтому, если самого источника света нет в кадре, свечение все равно видно.
Сочетанием обоих эффектов можно добиться приятной атмосферности в ночных сценах:


Чтобы не создавать лишний оверхед, этот эффект вынесен в отдельный субпроход, который по умолчанию отключен. Включается так:
game.deferred.passLight.volumetricScatteringEnabled = true;
Dagon 0.33.0
Вышла новая версия движка. Большую часть изменений я уже описывал в предыдущем посте. Сверх того — исправлен баг с падением движка, если не найдена библиотека Wintab, в dagon.core.application добавлена информация о версии: структура dagonVersion и строка dagonVersionString.
HiDPI и другие нововведения
В Dagon значительно обновляется система конфигурации. Многие опции из settings.conf я вынес в отдельные конфиги — render.conf и audio.conf. Также наконец-то появилась поддержка переопределения опций в конфигах на разных уровнях фиртуальной файловой системы — то есть, если создать settings.conf в APPDATA/<game>, то в нем можно переопределить опции, заданные в корневом settings.conf в папке с приложением. Корневой конфиг теперь загружается на ранней стадии инициализации, что позволяет задать в нем настройки логгера и вообще переопределить практически все доступные параметры приложения. Можно даже задать кастомные пути к SDL2, SDL2_Image и FreeType, что полезно под Linux.
Список новых опций settings.conf: log.enabled, log.level, log.toStdout, log.file, log.timestampTags, log.levelTags, appDataFolder, window.resizable, window.x, window.y, window.highDPI, vsync, stepFrequency, gl.debugOutput, font.sans, font.monospace, font.size, SDL2.path, SDL2Image.path, FreeType.path. Последние три поддерживают ОС-постфиксы (SDL2.path.windows, SDL2.path.linux), чтобы задавать разные пути в зависимости от платформы. Опции windowWidth, windowHeight, windowTitle заменены на window.width, window.height и window.title.
В dagon:audio внесены исправления для корректной поддержки многоканальных профилей (5.1, 7.1). Количество каналов можно указать в конфиге audio.conf, например для 5.1:
channels: 6;
Но самое крупное обновление — это поддержка дисплеев с высокой плотностью пикселей (HiDPI). Теперь можно создать окно с фреймбуфером больше, чем само окно, задав в конфиге
window.highDPI: 1;
Фактический размер области рисования окна можно узнать через свойства Application.drawableWidth и Application.drawableHeight, а отношение физических пикселей экрана к логическим — через Application.pixelRatio.
На картинке ниже показано, как отличается вывод одного и того же спрайта в обычном режиме (слева) и в HiDPI-режиме (справа).
Большая часть движка уже поддерживает HiDPI из коробки, за исключением HUDRenderer.
Dagon 0.32.0
Очередной релиз Dagon содержит значительное изменение — переход на OpenGL 4.3. Это не должно сильно ударить по поддержке видеокарт (движок работает на всех десктопных видеокартах, выпущенных за последние лет 10), но дает много новых возможностей, в особенности — доступ к вычислительным шейдерам. Соответственно, появился новый класс ComputeShader, о работе с которым я писал ранее. Добавлен один встроенный вычислительный шейдер — dagon.compute.resample, реализация ресэмплинга текстур. Еще одна фича OpenGL 4.3 — кэширование шейдерных бинарников. В теории это должно ускорять их загрузку, хотя в Dagon встроенных шейдеров не так уж и много, и кэширование пока большого значения не имеет. По умолчанию оно отключено — можно включить свойством Application.shaderCache.enabled, либо опцией enableShaderCache в settings.conf. Бинарники сохраняются в папку data/__internal/shader_cache.
Добавлен арена-аллокатор (dagon.core.arena) — я о нем тоже писал отдельный пост. Пока он, впрочем, не используется встроенными классами движка, но пригодится в будущем для интеграции GScript.
Новый модуль dagon.core.dialogs — минимальное кроссплатформенное решение для открытия системного диалога открытия/сохранения файла. Поддерживает Windows и Linux, зависимости при линковке не тянет. Под GNOME работает на основе Zenity, под KDE — на основе kdialog.
Добавлена поддержка так называемого «оконного полноэкранного режима»: если в конфиге заданы нулевые windowWidth и windowHeight, то движок создает безрамочное окно размером с весь экран. Этот режим удобен для мультимониторных конфигураций.
Наконец, добавлено новое расширение dagon:audio для воспроизведения звука через библиотеку SoLoud. Сама библиотека, как обычно, предоставляется в готовом виде при компиляции под 64-битные Windows и Linux. Под Windows также предоставляется libopenmpt для поддержки трекерной музыки.

