avatarcommunity
Gamedev6 месяцев назад

ECS - проблема коллизии сущностей при подгрузке и выгрузке игровых объектов

Дисклеймер: вопрос относится к тем реализациям ECS, где entity - это идентфикатор представленный парой целых чисел - index и generation. При этом index переиспользуется, и в каждый момент времени не должно существовать живых сущностей с одинаковыми индексами.

В чем собственно проблема: при выгрузки  игровых объектов - мы сохраняем их компоненты и сущности на диск, а затем удаляем их из игрового мира. Идентификаторы выгруженных игровых объектов могут быть переиспользованы. При подгрузке ранее выгруженного объекта мы получаем потенциальный конфликт двух живых сущностей с одинаковыми идентификаторами.

Вопрос: как нам избежать потенциального конфликта двух живых сущностей с одинаковыми идентификаторами?

Текущие решения, которые меня не устраивают:

  1. не удалять entity из игрового мира при выгрузке сущностей. Решение самое простое, но если игровая карта больших размеров с кучей объектов - в какой-то момент entity начинают отжирать нормально так памяти.
  2. вместо entity сохранять их алиасы (например UUID) и при подгрузке, для каждого игрового объекта создавать новую entity. Тут проблема с сылочной целостностью. Entity могут использоваться внутри компонентов, когда одной сущности надо ссылатсья на другую. Придется просмотерть все компоненты и поменять старую entity на новую. Это геморно и чревато трудно-отлавливаемыми багами.
2
2комментария