LeoECS Proto - 2 года разработки и новые оптимизации
С момента первого релиза LeoECS Proto
прошло уже два года - он продолжает развиваться и меняться благодаря обратной связи от подписчиков. Фреймворк показывает неплохие результаты в области, под которую он разрабатывался - быстрые и массовые структурные изменения мира (создание и удаление сущностей, добавление и удаление компонентов на них каждый кадр).
Перенос энумераторов итераторов в ядро
LeoECS Proto
изначально разрабатывался по следующей схеме - маленькое самодостаточное ядро и модули расширений на базе апи этого ядра. Все, что можно сделать с помощью апи - не должно присутствовать в ядре для упрощения его расширения и поддержки в будущем.
Подобным образом были реализованы итераторы - через явную реализацию Begin()
/Next()
/End()
-методов в ядре и их обертывания в сахар энумератора для поддержки foreach
-циклов в модуле расширения QoL
. Это позволяло упростить и унифицировать кодовую базу ядра для возможностей портирования на другие языки, в которых нельзя реализовывать собственные итераторы/энумераторы. Обратная сторона подобного подхода - немного страдала производительность реализации на C#
.
Практика показала, что практически во всех случаях использовались энумераторы из QoL
, а не апи чистого ядра, поэтому в последнем релизе было принято решение внести их в ядро и упростить апи. Это не поломало совместимость с текущим кодом (кроме реализации кастомных итераторов), так же из-за прямого доступа к данным итератора появилась возможность небольшой оптимизации для релизной сборки.
Сжатые битмаски компонентов
LeoECS Proto
использует для быстрой проверки на попадание сущности в итератор битовые маски. Подобная реализация страдает от увеличения количества типов компонентов в мире - каждый раз при добавлении новых 64 компонентов все последующие операции выборки будут происходить чуть медленнее из-за увеличения длины битовых масок. В последнем релизе данное поведение больше не является проблемой - вместо проверки маски целиком итератор теперь проверяет только значимые блоки. Это немного просаживает скорость на малом количестве компонентов в синтетике (что немного компенсируется переносом энумераторов в ядро), но на реальных проектах с большим количеством компонентов (256 и более) данная оптимизация дает результат. Да, можно подобрать данные для самого плохого случая - когда выборка происходит по равномерно распределенным компонентам в общем списке компонентов мира, но это синтетика и на практике такое маловероятно.
Завершение поддержки ECSLite
LeoECS Lite
с 22.04.2026 снимается с поддержки и уходит в архив - это значит, что репозитории будут доступны, но никаких изменений и исправлений уже не будет. Все обращения по внутреннему устройству или использованию так же станут частью самостоятельного изучения исходников пользователем. Текущее состояние проекта стабильное, известных ошибок нет и его можно без проблем использовать дальше, если все устраивает.