Я работаю над системой сущностей для сетевой игры и назначаю каждой сущности уникальный 32-битный целочисленный идентификатор, который я могу использовать для сериализации ссылок на сущности и сами сущности.
В настоящее время я просто увеличиваю счетчик каждый раз, когда создается объект. Я предполагаю, что идентификаторы со временем закончатся, но я не ожидаю, что у меня будет 4 миллиарда сущностей. Также это позволяет избежать проблемы, если сущность № 5 уничтожена, и мы получаем идентификатор 5. Это означает, что он ссылается на новый № 5 или старый удаленный № 5?
Проблема в том, что я не уверен, как справиться / избежать столкновений. В настоящее время, если клиент получает обновление для объекта с идентификатором выше, чем его текущий «свободный идентификатор», он просто увеличивает свой свободный идентификатор до этого. Но это не кажется очень надежным.
Я подумал о том, чтобы, возможно, назначить диапазоны каждому клиенту, чтобы они могли распределять сущности без конфликта (скажем, верхние n битов - номер игрока), но меня беспокоит, что произойдет, если диапазоны со временем начнут перекрываться.
Есть ли лучший способ справиться с этим? Должен ли я вообще беспокоиться о переполнении идентификаторов или выходе за пределы допустимого диапазона? Я мог бы добавить код для обнаружения этих случаев, но что бы он сделал, если бы они произошли, кроме аварии.
Другой вариант - использовать что-то с большей вероятностью быть уникальным, например, 128-битный GUID, но это кажется очень тяжелым для игры, которая пытается минимизировать сетевой трафик. Кроме того, реально мне никогда не понадобилось бы больше сущностей за один раз, чем поместилось бы в 32-битное или даже 24-битное целое число.
Благодарность!