LeoECS Proto - 2 года разработки и новые оптимизации

С момента первого релиза LeoECS Proto прошло уже два года - он продолжает развиваться и меняться благодаря обратной связи от подписчиков. Фреймворк показывает неплохие результаты в области, под которую он разрабатывался - быстрые и массовые структурные изменения мира (создание и удаление сущностей, добавление и удаление компонентов на них каждый кадр).

Перенос энумераторов итераторов в ядро

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

Подобным образом были реализованы итераторы - через явную реализацию Begin()/Next()/End()-методов в ядре и их обертывания в сахар энумератора для поддержки foreach-циклов в модуле расширения QoL. Это позволяло упростить и унифицировать кодовую базу ядра для возможностей портирования на другие языки, в которых нельзя реализовывать собственные итераторы/энумераторы. Обратная сторона подобного подхода - немного страдала производительность реализации на C#.

Практика показала, что практически во всех случаях использовались энумераторы из QoL, а не апи чистого ядра, поэтому в последнем релизе было принято решение внести их в ядро и упростить апи. Это не поломало совместимость с текущим кодом (кроме реализации кастомных итераторов), так же из-за прямого доступа к данным итератора появилась возможность небольшой оптимизации для релизной сборки.

Сжатые битмаски компонентов

LeoECS Proto использует для быстрой проверки на попадание сущности в итератор битовые маски. Подобная реализация страдает от увеличения количества типов компонентов в мире - каждый раз при добавлении новых 64 компонентов все последующие операции выборки будут происходить чуть медленнее из-за увеличения длины битовых масок. В последнем релизе данное поведение больше не является проблемой - вместо проверки маски целиком итератор теперь проверяет только значимые блоки. Это немного просаживает скорость на малом количестве компонентов в синтетике (что немного компенсируется переносом энумераторов в ядро), но на реальных проектах с большим количеством компонентов (256 и более) данная оптимизация дает результат. Да, можно подобрать данные для самого плохого случая - когда выборка происходит по равномерно распределенным компонентам в общем списке компонентов мира, но это синтетика и на практике такое маловероятно.

Завершение поддержки ECSLite

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

Актуальные версии пакетов доступны в закрытом telegram-сервере для vk/boosty-подписчиков.
Оформить подписку можно здесь: