📊 Статистика: 10 коммитов, 5 356 добавлений и 3 759 удалений.
За последние 7 дней в HollowEngine я работал по следующим задачам: система переменных в блоках кода, подход к локализации, сохранение компонентов и новый рендер моделей через инстансинг.
🧠 Блоки кода и переменные
Я немного доработал систему переменных в блоках кода. Появились новые виды переменных, из-за чего сами скрипты стали заметно гибче: теперь можно аккуратнее работать с данными текущего контекста, сервера и сущностей, ранее были доступны только переменные одной ветки. Но всё ещё продолжается доработка NBT-переменных сущностей.
Параллельно я подчистил валидацию и диагностику графов этих самых блоков. При наличии ошибок, они будут появляться в `hollowengine/logs/codeblocks-validation.log`.
Из видимых изменений:
• появились новые variable blocks и scoped/context-переменные
• улучшена работа output-переменных событий
• доработан анализ графа и сообщений об ошибках
• поправлены проблемы с восстановлением скриптов после сбоев
• добавлены команды и тесты для проверки новой логики
🌍 Новая система локализации
Отдельно переработал lang-систему. Вместо двух огромных файлов en_us.json и ru_ru.json на 1500 строк, локализация теперь разложена по небольшим JSON-файлам по категориям: GUI, code blocks, IDE, теги, команды и так далее.
Так что теперь работать с переводами движка куда проще, одно дело, когда у тебя в моде пара десятков предметов, блоков и несколько механизмов с интерфейсами, а другое, когда у тебя одних только блоков кода штук 150... При этом, всё совместимо с текущей системой переводов Minecraft, поскольку работает через Gradle-скрипт для объединения нескольких lang-файлов, так что бы они собирались в один общий файл без повторов.
🧱 Компоненты и сохранение сущностей
Ещё одно важное исправление - ленивая инициализация ECS-сущностей. Теперь в ECS добавляются только сущности у которых уже есть какие либо компоненты, т.е. на больших сборках нагрузка станет меньше, а обработка нпс - быстрее.
🎨 Инстансинг и поддержка Iris
Самая большая задача недели - начало нормальной поддержки инстансинга для моделей.
Сейчас в рендере происходит сбор одинаковых примитивов, чтобы потом вместо того, чтобы по одному их кидать через `Java -> JNI -> OpenGL -> GPU` сразу отправить большую пачку из десятков, сотен, а то и тысяч моделей. Не стоит пока ждать огромного прироста производительности, посколькe BlockBench-модели состоят из большого количества кубов, каждый из которых даже через инстансинг производительность особо не повысит в сравнении с уже существующим механизмом батчинга, а одновременно обрабатывать и скиннинг, и инстансинг движок пока не умеет. Но в случае с большим количеством статичных высоко полигональных моделей прирост производительности может быть в 10, а то и в 100 раз лучше, чем то, что было раньше.
И главное - это всё работает с шейдерпаками Iris! Движок сам вмешивается в его пайплайн, находит шейдеры отвечающие за тени и g-buffer и модифицирует их под инстансинг, при этом стараясь сохранить совместимость с кастомными шейдерами.
P.S. на Oculus тоже должно работать, но я не проверял, если порт кривой, значит работать не будет, если порт надёжный - работать будет 🙃
🖼 Ещё по мелочи
Помимо крупных задач, был исправлен баг с изображениями при перезагрузке ресурсов в Kool UI.
На этом за неделю всё. Получилось меньше фич, чем в прошлом девлоге, но зато эта неделя хорошо повлияла на производительность и стабильность