Nau Engine: взгляд под капот. Ядро движка

f69c91ea704ea91b70cd7db0413affbe.png

Nau Engine — 3D-движок для создания игр и приложений, который находится в активной фазе разработки с начала 2023 года. Одна из целей его создания — дать возможность любому разработчику реализовать проекты своей мечты, поэтому Nau Engine является Open Source-решением и будет распространяться бесплатно по лицензии BSD-3-clause. Beta-версия Nau Engine выйдет в конце ноября 2024 года.

Каждый игровой движок — это сложный механизм, состоящий из множества взаимосвязанных систем. В Nau Engine мы уделили особое внимание созданию фундамента, который станет основой для развития движка.

В этой статье мы рассмотрим ключевые компоненты ядра Nau Engine. Выбор технологий и архитектуры ядра напрямую влияет на то, какими возможностями будут обладать проекты, разработанные с помощью нашего движка. О них и поговорим.

714c491c3d4c6be2d0dd449c54d451fe.png

Архитектура проекта: гибкость и масштабируемость

Определяющим моментом в архитектуре проектов является используемая в них структура данных, подход к хранению и взаимодействию сущностей. Классическим спором последних лет в этом вопросе является «GameObject против ECS», каждая из сторон которого имеет свою область применения, плюсы и минусы.

В рамках грядущей beta-версии основной фокус сделан на GO-проекты, как более распространенные и менее требовательные к разработчику как пользователю движка. 

Идеологически Nau Engine построен на принципах модульности и взаимозаменяемости отдельных подсистем, потому при имплементации прикладных решений (физики, сети, пользовательских интерфейсов) мы заранее закладывали возможность их применения в ECS-архитектуре.

Дополнительно в движке присутствует адаптированная ECS-библиотека от движка Dagor — эффективное и производительное решение, проверенное на проектах WarThunder, Enlisted и других, но ее использование на текущем этапе потребует значительное погружение в код движка.

Скриптование: свобода выбора

Значимым вопросом выбора движка и удобства работы с ним является язык программирования, на котором пишется основная логика создаваемого проекта. Предпосылки к его выбору зачастую не ограничиваются техническим полем, а затрагивают как конечную платформу сборки, так и существующие компетенции  в рамках команды.

При проектировании движка мы отталкивались от потребности создавать продукты, а также делиться инструментами и наработками с максимально широким кругом специалистов — то есть без привязки к используемым в рамках конкретной команды языкам программирования. Поэтому одним из важнейших модулей является гибкая система language-agnostic скриптования — инструмент эффективного подключения пользовательской логики, написанной на удобным разработчику скриптовом языке, к C++-рантайму самого движка. Доклад о процессе разработки этой системы был презентован на конференции C++ Russia 2024.

В рамках beta-версии в 2024 году основное написание пользовательского кода предполагается средствами языков C++ (для всех систем движка) и Lua (для основных функций и систем). Подключая скрипты как компоненты к гейм-объектам на сцене, разработчик будет управлять игровой логикой в своём проекте.

Общая система language-agnostic скриптования может работать как внешняя библиотека для самого движка и как отдельный законченный продукт, готовый к использованию в IT-сфере, в том числе за пределами разработки видеоигр.

73fcf318fde0e58919200ef7ad6b6c7c.png

Конвейер ассетов: простота и гибкость в работе с контентом

«Контентный пайплайн» — набор инструментов для производства, настройки и интеграции содержимого проектов — разнится от компании к компании в игровой индустрии. Модели, звуки, анимации, текстуры и прочие элементы создаются во множестве популярных профессиональных редакторов и затем добавляются в проект средствами самих движков или же самописными утилитами.

Наличие единообразного входного формата для движка позволяет упростить правила обработки создаваемого контента, уменьшить количество операционных ошибок и «накладных расходов». Мы выбрали в качестве такого единого формата OpenUSD — открытый фреймворк, изначально разработанный компанией Pixar и поддерживаемый сейчас всеми крупными DCC-пакетами (инструментами по созданию цифрового контента).

В Nau Engine формат USD выступает в роли универсального контейнера для использования разнообразных типов ассетов: от 3D-моделей и текстур до звуковых эффектов. Его гибкость и универсальность отлично подходят для импорта, настройки и управления данными в редакторе. Для работы в рантайме (во время работы приложения) используются внутренние бинарные форматы данных, которые обеспечивают необходимую скорость обработки.

В beta-версии движка планируется поддерживать работу с типовыми форматами ассетов следующих типов: сцена / уровень, геометрия (статическая и скелетная), текстуры, анимации, физические объекты, GUI, звук, частицы (VFX).

Приложения, поддерживающие OpenUSD

Приложения, поддерживающие OpenUSD

Рендер и VFX: графика и эффекты

Одним из самых заметных модулей движка всегда является рендер-система — именно она определяет картинку, которую видит игрок в конечной игре. От её гибкости зависит количество доступных графическим программистам и техническим художникам инструментов, а от производительности — требования к характеристикам платформы и в конечном итоге к модели видеокарты игрока. Из графических API на сегодняшний день реализована поддержка DX12 для работы на ОС Windows.

В качестве фундамента мы используем низкоуровневый рендер из открытого репозитория движка Dagor — набор производительных библиотек для взаимодействия с графическим API системы и железом пользователя, расчета треугольников, текстур и шейдеров на видеокарте. На базе этого кода с современными технологиями физически корректного рендеринга и каскадных карт теней уже были созданы зарекомендовавшие себя мультиплатформенные продукты.

Поверх него в Nau Engine реализована высокоуровневая рендер-система, отвечающая за управление объектами сцены, хранение их в памяти и интеграцию с конвейером ассетов. Написание шейдеров сейчас происходит на стандартном HLSL.

Помимо базового рендер-графа из открытого репозитория компании Gaijin в Nau Engine используется подсистема daFX — инструмент создания и управления визуальными эффектами, такими как пламя, взрывы и частицы. Настройка эффектов в Nau Engine производится в рамках единого редактора, наравне с объектами сцены, скриптами и анимациями. Подробнее про редактор мы расскажем в следующем материале:)

Физика: реалистичный игровой мир с динамичными событиями

Фундаментальным модулем любого игрового движка является система физики — инструмент разработчика для широкого спектра задач от простого расчета сил и столкновений до сложных симуляций волн вокруг корабля и волос персонажа.

Написание собственного физического движка — достаточно популярная задача как в академической сфере, так и среди разработчиков игр. Многие программисты из нашей команды также совершали подход к этому снаряду в рамках прошлых проектов. В условиях сжатых сроков разработки мы, разумеется, не ставили задачу по переизобретению этого велосипеда и использовали существующие наработки из проектов с открытым кодом.

В качестве физического движка в Nau сейчас используется физика Jolt. В beta-версии будет поддержка твёрдых тел, физических материалов, mesh- и примитивных коллайдеров, рейкастинга, настройки каналов коллизий.

62dab6713cd5e89ab933492a41a75a4a.png

Аудио и Сеть: погружение в атмосферу и многопользовательские игры

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

В первую очередь Nau Engine фокусируется на базовых потребностях работы со звуковыми треками, их импорте, настройке внутри проекта и вызове из работающего приложения. В качестве основы программного кода мы используем miniaudio — аудиодвижок  с открытым кодом. Разработчик сможет оперировать контейнерами с аудиофайлами, настраивая различные параметры их воспроизведения.

Разделять свой игровой опыт с другими позволяют инструменты взаимодействия с сетью — набор сервисов и протоколов. Их использование позволяет разработчикам передавать команды с клиента на сервер и обратно, синхронизировать состояние мира нескольких игроков и в конечном итоге обеспечивать максимально плавное движение пикселей по экранам мониторов, находящихся на разных концах страны.

Для этого мы разработали модуль репликации игровой логики, который позволит разработчикам делать простые многопользовательские проекты.

Низкоуровнево в основе нашего решения лежат библиотеки с открытым кодом GameNetworkingSockets и ASIO для поддержки P2P соединений через UDP и прямых соединений через TCP соответственно.

GUI и Ввод: удобный интерфейс и интуитивный ввод для игрока

Неотъемлемой частью любой видеоигры является взаимодействие с игроком — совокупность интерфейсов, отображения всевозможных индикаторов, плюс механизмов передачи ввода.

В рамках общих принципов архитектуры Nau Engine мы спроектировали систему интерфейсов в виде обособленного модуля, который будет использоваться в GO-проектах грядущей beta-версии.

Базовые компоненты системы интерфейсов Nau Engine построены на основе существующих решений из опенсорсного движка Cocos2dx. Дополнительно мы используем библиотеку Dear ImGui для технических, отладочных целей и отрисовки служебных сущностей.

Ввод в Nau Engine реализован посредством низкоуровневой системы gainput и собственного решения поверх неё. В ноябрьской версии у разработчика будет возможность создавать проекты с поддержкой клавиатуры и мыши.

189fa1a29f3e0ad577946d84c9162baf.png

Анимации: живые персонажи и динамичные эффекты для уникального стиля

Реалистичность происходящего на экране определяется не только физической моделью под капотом движка, но и широтой настроек анимаций различных объектов. Именно эти настройки позволяют превратить статичную картинку в живую движущуюся сцену, разнообразно реагирующую на действия игрока.

В рамках beta-версии у разработчика будет возможность оперировать анимациями на ключевых кадрах (keyframe) для настройки положения и свойств объектов сцены. Кроме того, будет работать импорт скелетных анимаций для персонажей (и других объектов с использованием скелетных моделей), а также управление ими из скриптов пользовательской логики. Фундамент для импорта и воспроизведения скелетных анимаций предоставляет открытый код из библиотека ozz-animation.

Подведем итоги: будущее игровой разработки

В конце ноября нас ждёт знаковый рубеж взаимодействия с широким кругом пользователей. Впереди — проекты, которые будут стартовать на нашем движке, и разработчики, которые будут его улучшать — как для себя, так и для всего остального сообщества.

Как команда продукта с открытым кодом, который развивается для сообщества и вместе с сообществом, мы будем рады обратной связи от вас, от будущих пользователей Nau Engine и от всех небезразличных коллег :)

Оставить обратную связь по статье и задать вопросы можно, перейдя на специальную форму.

© Habrahabr.ru