Dagon

Dagon - это мой новый фреймворк для разработки 3D-игр, появившийся в результате переосмысления некоторых концепций DGL. В процессе работы над Atrium я пришел к выводу, что в движке не хватает средств автоматизации некоторых рутинных задач. Например, управление памятью в типичном игровом приложении может быть почти полностью автоматизировано, поскольку выделение и высвобождение
памяти происходит в специально задуманных паузах, таких как переключение между локациями (это не относится к играм с открытым миром с фоновой подгрузкой, но это уже специфический случай). Кроме того, в обсуждении на Reddit звучал вопрос, почему DGL не использует SDL2. Так родилась новая ветка движка, которую я решил сделать отдельным экспериментальным проектом. Постепенно Dagon начал обрастать новыми возможностями, которых нет в DGL, а затем и вовсе был переписан под OpenGL 3.3. Движок все еще находится в активной разработке, но уже сейчас выдает, как мне кажется, неплохую современную картинку.

Исходники:
https://github.com/gecko0307/dagon

Демонстрационное приложение:
https://github.com/gecko0307/dagon-demo



На сегодняшний день Dagon включает следующие особенности и возможности:
  • Использование OpenGL 3.3 и SDL2
  • Новая модель управления памятью на основе концепции владельца (owner), позаимствованной из Delphi. Любой объект может принадлежать другому: когда удаляется объект-владелец, удаляются и все принадлежащие ему объекты. Это позволяет, в большинстве случаев, обойтись без деструкторов и практически устраняет утечки памяти (ну или, по крайней мере, сильно облегчает их отладку). Использование owner'ов связывает все данные в программе единой древоообразной структурой, что позволяет ввести полуавтоматическое детерминированное управление памятью. Части этого дерева могут быть удалены по отдельности (например, когда нужно высвободить память из-под текущей сцены и загрузить новую), а в конце работы приложение удаляет все объекты, начиная с корневого.
  • Менеджер сцен. Каждая сцена - это отдельная сущность со своим набором объектов и ресурсов, логическим контекстом, параметрами графического конвейера и т.д. Сцены определяются заранее и загружаются по требованию. Доступ к сценам осуществляется по уникальным именам - можно изнутри одной сцены переключиться на другую. Набор сцен определяет структуру игрового приложения: заставки, меню, уровни, режим отладки/редактирования и т.д. Все как в движках типа Unity или BGE.
  • Модель сущностей и компонентов (entity-component), позволяющая расширять функциональность объектов динамически, без наследования классов. Сущность (Entity) - это сценический объект, способный что-то рендерить в определенной точке пространства. Компоненты, которые в Dagon называются поведениями (Behaviour), задают внутреннюю логику сущностей. Например, при помощи поведений можно заставить сущность реагировать на нажатия клавиш и другие события. Можно добавлять несколько поведений, тем самым наделяя объекты различными комбинациями способностей.
  • Контроллер - специальная абстракция, позволяющая гибко управлять трансформацией сущностей. Например, можно создать контроллер твердого тела, чтобы синхронизировать сущность с телом в физическом движке, либо контроллер персонажа, позволяющий двигать сущность по законам кинематики. Контроллеры, опять-таки, можно переключать, что позволяет добиться интересного поведения объектов - например, запрыгнув на поезд, персонаж может получить специальный контроллер, двигающий его вместе с поездом, а когда он слезает на землю, то к нему возвращается контроллер по умолчанию.
  • Динамическая перезагрузка ресурсов при их модификации сторонним приложением без перезапуска игры. 
  • Система событий.
  • Поддержка форматов OBJ и IQM.
  • Поддержка текстур PNG, JPG, TGA, BMP.
  • Поддержка контейнера Box для ресурсов. Это простой несжатый архив, альтернатива TAR с использованием UTF-8 для имен файлов.
  • Новая система материалов с разделением на абстрактный фронтенд (набор параметров) и специализированный бэкенд (передатчик параметров графическому конвейеру). Основная идея - отделение описания материала от непосредственной его реализации - например, для настройки качества графики в игре, комбинирования различных опциональных эффектов, которые можно настраивать на уровне бэкенда, а не материала. Система позволяет использовать как стандартные материалы с известным набором параметров, так и создавать свои, специализированные. 
  • Кластерный прямой рендеринг - техника, позволяющая пофрагментно варьировать количество источников света и, таким образом, достигать в классическом прямом рендере учета сотен источников света без заметного ухудшения производительности.
  • Каскадные теневые карты (cascaded shadow maps).
  • Normal mapping, parallax mapping, parallax occlusion mapping.
  • Сферические объемные источники света (spherical area lights).
  • Процедурное динамическое небо с солнцем.
  • Система частиц с поддержкой векторных (силовых) полей. 
  • Рендеринг текста в кодировке UTF-8 с использованием TTF-шрифтов. 
  • Встроенная логика для камеры от первого лица (first person view) и свободного просмотра сцены (freeview).
  • Постобработка, встроенные фильтры FXAA и lens distortion.
    Я рассчитываю, что перенос Atrium на Dagon сильно упростит и упорядочит логику игры. Кроме того, новая архитектура позволит ввести поддержку разных интересных современных графических техник.

    Комментариев нет:

    Отправить комментарий