LeoECS Proto - запрет на создание пустых сущностей
Во всей линейке LeoECS
(Classic, Lite, Proto) есть одна особенность - сущности автоматически уничтожаются при удалении последнего присоединенного к ним компонента. При этом сущности изначально создаются пустыми с последующим добавлением на них компонентов - это создает ситуацию, когда из-за ошибки в коде мы можем забыть добавить компоненты и сущность останется пустой. В результате сущность выйдет из-под контроля, что приведет к утечке памяти.
Для контроля над подобными “потерянными” сущностями в DEBUG
-режиме существует специальный механизм по учету вновь создаваемых сущностей и проверке, что они активны и содержат компоненты. Данный механизм работает как часть ProtoSystems
(группы систем) и выполняет проверки после запуска каждой системы. Это значит, что в unit-тестах, не использующих механизмы ProtoSystems
такие ошибки не обнаруживаются и даже хуже - происходит накопление списка проверок сущностей, который не будет никогда обработан и очищен. При запуске приложения эти проверки так же постоянно выполняются, что негативно сказывается на производительности во время разработки в случае, когда сущности создаются сотнями или тысячами за раз.
Было принято решение изменить поведение по умолчанию и убрать возможность создания пустых сущностей - теперь сущности создаются через пулы компонентов с принудительным добавлением этих компонентов к новой сущности. Это позволит убрать промежуточное потенциально ошибочное состояние сущности - если она существует, то на ней точно присутствуют компоненты. Так же это позволит убрать определенное количество проверочного кода, приложение в DEBUG
-режиме будет работать быстрее.
Апи поменялось незначительно:
1 | // Было: |
Для любителей стрелять себе в ноги оставлен механизм создания пустых сущностей без контроля за их корректностью - достаточно добавить директиву препроцессора LEOECSPROTO_NEW_EMPTY_ENTITY
и метод ProtoWorld.NewEntity()
станет доступным как раньше.