LeoECS Proto - запрет на создание пустых сущностей

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

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

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

Апи поменялось незначительно:

1
2
3
4
5
6
7
8
9
// Было:
ProtoEntity entity = world.NewEntity ();
ref C1 c = ref c1Pool.Add (entity);

// Стало:
ref C1 c = ref c1Pool.NewEntity (out var entity);

// Если сущность не нужна (для событий, например):
ref C1 c = ref c1Pool.NewEntity ();

Для любителей стрелять себе в ноги оставлен механизм создания пустых сущностей без контроля за их корректностью - достаточно добавить директиву препроцессора LEOECSPROTO_NEW_EMPTY_ENTITY и метод ProtoWorld.NewEntity() станет доступным как раньше.

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