ECS - проблема коллизии сущностей при подгрузке и выгрузке игровых объектов
Дисклеймер: вопрос относится к тем реализациям ECS, где entity - это идентфикатор представленный парой целых чисел - index и generation. При этом index переиспользуется, и в каждый момент времени не должно существовать живых сущностей с одинаковыми индексами.
В чем собственно проблема: при выгрузки игровых объектов - мы сохраняем их компоненты и сущности на диск, а затем удаляем их из игрового мира. Идентификаторы выгруженных игровых объектов могут быть переиспользованы. При подгрузке ранее выгруженного объекта мы получаем потенциальный конфликт двух живых сущностей с одинаковыми идентификаторами.
Вопрос: как нам избежать потенциального конфликта двух живых сущностей с одинаковыми идентификаторами?
Текущие решения, которые меня не устраивают:
- не удалять entity из игрового мира при выгрузке сущностей. Решение самое простое, но если игровая карта больших размеров с кучей объектов - в какой-то момент entity начинают отжирать нормально так памяти.
- вместо entity сохранять их алиасы (например UUID) и при подгрузке, для каждого игрового объекта создавать новую entity. Тут проблема с сылочной целостностью. Entity могут использоваться внутри компонентов, когда одной сущности надо ссылатсья на другую. Придется просмотерть все компоненты и поменять старую entity на новую. Это геморно и чревато трудно-отлавливаемыми багами.
