Обновления со второй половины сентября по первую половину декабря 2019 г.

Опубликовано 24 декабря 2019 г.

Как обычно, в последние месяцы года в проект было вложено много работы.

В движок добавлено множество новых и важных функций, многие из них связаны с расширением возможностей рендеринга спрайтов.

JugiMap

Недавно со мной связался Jugilus, автор JugiMap, для сотрудничества. Он интересовался nCine как серверной частью рендеринга спрайтов, наряду с Cocos2d-x, AppGameKit и SFML, для тестирования инструмента интеграции API и предварительного просмотра в реальном времени экспортированных карт и логики.

Он составил список требований к функциям, которых в то время не было в движке, но которые были у любого другого бэкэнда. Честно говоря, функции, которые он упомянул, так или иначе уже были в моем списке дел, поэтому мне просто нужно было изменить свои приоритеты, чтобы удовлетворить потребности проекта. 😉

Функции, которые я реализовал из его списка, следующие:

  • Пользовательские опорные точки
    Он позволяет привязывать узел к точке, отличной от его центра, например к одному из четырех углов, и трансформировать его относительно него. Эта функция требовала множества доработок, чтобы работать в каждом случае и с каждым типом узла.
  • Неравномерное масштабирование
    Узлы теперь можно масштабировать независимо друг от друга по горизонтальной или вертикальной оси. Эта функция уже давно была запрошена тестировщиком ncParticleEditor. 😅
  • Переворот текстуры с логическим флажком
    Это изменение имеет большой смысл, поскольку теперь вы можете запрашивать и проверять, перевернут ли спрайт по одной из осей. Раньше переворачивание было просто действием, и нельзя было определить, перевернут ли спрайт или нет. Это также означает, что, как и в случае с пользовательской точкой привязки, если вы меняете что-то в спрайте, например, текстуру, движок должен автоматически повторно применить любое переворачивание.
  • Пользовательские коэффициенты смешивания
    Еще одна функция, которую давным-давно запросил тестер ncParticleEditor. :P Теперь пользователь может указать пользовательский исходный или конечный фактор для смешивания или использовать один из пресетов, что позволяет использовать предварительно умноженные альфа-текстуры или аддитивные эффекты.

Я был очень рад, что демонстрационный тест API стал большим стресс-тестом для рендеринга спрайтов, он выявил такие серьезные проблемы, как:

  • Задержки кадра с преобразованиями родитель/потомок
  • Отбор рисуемых узлов не работает с отрицательным масштабированием
  • Задержка в один кадр для обновления кэшированных границ текстового узла

Вы можете найти репозитории проекта на GitHub: ncJugiMapAPIDemo и ncJugiMapAPIDemo-data. Вы также можете протестировать веб-тест Emscripten.

Усовершенствования Эмскриптена

Порт Emscripten также претерпел некоторые улучшения и исправления. Прежде всего, теперь он может собираться с версией 1.39.0 или новее, что сделало бэкэнд LLVM WebAssembly по умолчанию.

Еще одним важным исправлением является правильная обработка изменения размера окна браузера: приложение Emscripten теперь должно корректно отображаться независимо от размера окна браузера или полноэкранного режима. Непрерывное изменение размера теперь также должно работать для настольных версий, где матрица перспективы ранее не обновлялась. 😅

Развертывание инструмента на основе nCine в Emscripten имеет гораздо больше смысла, поскольку теперь можно загружать и сохранять файлы локально. Это означает, что вы можете загрузить файл со своего компьютера в веб-сборку или сохранить его оттуда на свой компьютер. Вы можете протестировать эту функцию в обновленном веб-тесте ncParticleEditor. Вы также заметите поддержку загрузки пользовательских шрифтов ImGui в виде значков FontAwesome. 😉

И последнее, но не менее важное: после долгих мучений сборки Emscripten теперь могут использовать автоматическое группирование команд рендеринга! 💪 Есть только одна маленькая загвоздка, размер партии фиксированный. 😩

Конечно, вы можете настроить его при инициализации, но он фиксированный, нет минимума или максимума, приложение будет собирать определенное количество команд за пакет. Он разделит пакет, если он достиг заданного размера, или отобразит отдельные команды без пакетов, если их недостаточно. Вы также должны держать это число довольно маленьким, чтобы компилятор шейдера D3D в ANGLE не занимал много времени. 😄

Ядерная интеграция

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

Дополнительные улучшения

За это время было добавлено много мелких вещей:

  • Есть два новых события приложения, на которые вы можете подписаться: onSuspend и onResume. Таймеры кадров и профилей не будут учитывать время, в течение которого приложение было приостановлено.
  • Теперь существует класс ColorHdr, который позволяет использовать нефиксированные значения цвета с плавающей запятой, которые можно использовать для поддержки HDR в инструментах или демонстрациях.
  • Сортировка команд рендеринга теперь стабильна, больше не должно быть случайного появления одного спрайта перед другим. Две команды с одинаковым ключом сортировки материалов будут отсортированы по времени их создания.
  • Класс матриц 4x4 поддерживает преобразования на месте. Это означает, что будет использоваться меньше памяти и будет выполняться меньше умножений при перемещении, вращении или масштабировании на месте.
  • Удаление дочерних узлов сцены при уничтожении родителя теперь необязательно.
  • Как обычно, интеграция с ImGui и Tracy была обновлена ​​для поддержки последних версий на момент написания.

Наслаждайтесь новыми функциями nCine и праздничным сезоном независимо от того, празднуете вы Рождество или нет. ⛄️

Первоначально опубликовано на https://encelo.github.io.