Многоплатформенный асинхронный 2D-движок на основе Vulkan с использованием новейших подходов.
Цель Xenolith - быть быстрой и экономичной системой для 2D-рисования и современных вычислительных задач на GPU для всех основных платформ: Windows, Linux, Android, MacOS, iOS (в планах).
Большинству современных приложений и игр, помимо рисования в 2D, необходимо решать вычислительные задачи, связанные с Machine Learning и Computer Vision. Xenolith позволяет соединить эти задачи в рамках одного вычислительного графа и эффективно распределить ресурсы CPU и GPU по задачам.
Будучи игровым движком по природе, Xenolith построен вокруг необходимости обеспечивать стабильную кадровую частоту в любых условиях и не доспускать пропуска кадров при подгрузке ресурсов.
Однако, будучи асинхронным движком, Xenolith не будет подготавливать новый кадр, если на сцене нет изменений. Таким образом, возможна значительная экономия ресурса мобильных устройств в простое.
Ключевые особенности:
- Полная асинхронность всех событий, включая рендеринг
- Модульная реализация RenderGraph
- Возможность использовать зависимые друг от друга графические и вычислительные проходы в RenderGraph
- Высокоточная типографика
- Поддержка векторной 2D-графики
- Интеграция с БД, встроенной в приложение/игру
Входит в состав Stappler SDK:
см. https://github.com/libstappler/libstappler-root
События ввода, обновление экрана, загрузка ресурсов и материалов - всё обрабатывается асинхронно и эффективно распределяется по потокам на CPU и GPU.
Начальная загрузка движка также выполняется асинхронно, что снижает время начального запуска до четырёх раз в сравнении с синхронной инициализацией.
Задачи для GPU также выполняются асинхронно и параллельно. Движок может обслуживать сразу несколько очередей рендеринга в одном контексте.
Абстрактная реализация RenderGraph (xenolith::core::Queue) позволяет выстраивать сложные схемы рендеринга, автоматически обрабатывающие зависимости между ресурсами и вложениями. Система позволяет включать в систему параллельно выполняемые графические и вычислительные проходы, опциональные и полностью асинхронные проходы.
Путь рендеринга также определяется асинхронно на основе порядка поступления входящих данных для каждого ресурса и прохода. Это больше соответствует асинхронной природе движка, чем классический подход линеаризации графа.
Поддерживается работа на Windows, Linux, Android, MacOS. Движок разработан таким образом, чтобы использовать современные асинхронные возможности платформы, такие, как WinAPI IOCP, io_uring на Linux, GCD и CFRunLoop на MacOS. Также, решено множество проблем, связанных с особенностями работы Vulkan на Android и MoltenVK на MacOS.
Параметр плотности пикселей (density) и динамическое изменение размеров окна определены в вычислительном ядре движка, из-за чего разработка графических систем для разных экранов сильно упрощается.
Поддерживается любая кадровая частота и любая плотность пикселей. Есть поддержка HDR.
Движок создан для выполнения на GPU как задач рендеринга, так и вычислений. Это позволяет использовать, в том числе, подходы Machine Learning и другие вычислительно сложные подходы одновременно с рендерингом, в том числе, и на мобильных устройствах.
Кадры обрабатываются асинхронно и только по необходимости, при обновлении графа сцены. Это значительно экономит вычислительные ресурсы при простое всего приложения или отдельных его подсистем.
Также, внутренние структуры оптимизированы таким образом, чтобы использовать минимально необходимый объём оперативной и видеопамяти.
Система графа сцены создана с учётом современных подходов к оптимизации рендеринга. За счёт этого движок может существенно оптимизировать число вызовов отрисовки (например, нарисовать весь разнородный текст за один вызов).
Задачи подготовки вершин на CPU выполняются асинхронно и параллельно в нескольких потоках, эффективно размещаются между выполнением обновления графа сцены и подготовкой вершинного буфера. Большинство структур графа сцены выполнены с оптимизацией Copy-on-write.
При рисовании текстов используются коррекции к вычислениям, позволяющие точно сопоставить экранный пиксель с пикселем глифа шрифта. Таким образом, для отрисовки шрифтов не используются системы линейной фильтрации, антиалиасинга, LCD-хинтинга и других искажений исходных глифов. С учётом системы плотности пикселей, любой глиф шрифта, независимо от заданных параметров размера (font size) и масштаба (scale), переносится на экран попиксельно один-в-один, обеспечивая идеальную типографику.
Шрифтовый движок поддерживает динамические шрифты (variable fonts) с изменением любых параметров в реальном времени, кеширует обработанные глифы на стороне GPU.
Движок использует тесселятор из набора Stappler SDK для преобразования векторной графики в набор треугольников, которые передаёт на рисованик GPU. Это позволяет использовать сложную векторную графику без снижения производительности на её растеризацию.
Также, движок оптимизирован, чтобы повторно использовать однотипные векторные примитивы для ещё большего ускорения загрузки и отрисовки.
За счёт векторной графики и тесселятора работают быстрые SDF-подобные тени: тесселятор предоставляет необходимые векторные карты нормалей для их создания.
-
Унифицированный граф сцены (схожий с Godot/Cocos2d)
-
Асинхронная загрузка данных для примитивов прокрутки (ScrollView)
-
Полнофункциональный собственный ввод текста (не наложение компонентов ОС) с использованием экранной клавиатуры для мобильных устройств. Поля ввода могут быть полностью кастомизированы внутри движка.
-
Готовый механизм интеграции для сложносвязных баз данных на основе SQLite или PostgreSQL, в том числе, с поддержкой полнотекстового поиска
-
Готовый механизм загрузки и обновления сетевых ассетов
-
Для touch-экранов - поддержка многопальцевых жестов
-
Поддержка работы в windowsless-режиме
-
Система материалов позволяет связать с материалом произвольный объём данных, доступных в шейдере
-
(в разработке) Системы частиц на стороне GPU
-
(в разработке) Интеграция со Spine Runtime
-
Генерация промежуточных кадров для предзаписанных 2D-анимаций
2025-05-28.21-57-20.mp4
- Динамические шрифты в реальном времени
2025-05-28.22-10-38.mp4
- Динамические обводки и реализация гексагонального поля на основе векторных объектов