Я рассматриваю возможность сохранения ссылок на все объекты в графе сцены моего игрового движка в хэш-карту с идентификатором экземпляра в качестве ключа.
Всякий раз, когда объект имеет ссылку на другой объект, он будет использовать идентификатор экземпляра вместо указателя.
Мое обоснование этой идеи заключается в том, что это сделает сериализацию / десериализацию моего графа сцены и облегчит обработку ссылок на уничтоженные объекты.
Какое влияние это окажет на производительность при обращении к объекту?
Есть ли еще недостатки этой реализации, кроме производительности?
Разыменование указателя часто постоянное время. Обычно это одна инструкция по сборке.
Поиск значения в std::unordered_map
также постоянное время, но обычно намного медленнее. Вероятно, будет огромный спад производительности, если вы захотите получить доступ к значению, но вы всегда должны оценивать его раньше.
Если вы часто сериализуете / десериализуетесь (например, отправляете по сети), это может стоить того. Однако, вероятно, стоит присвоить идентификаторы при сериализации и преобразовывать идентификаторы в указатели при десериализации.
Другим недостатком является то, что это, вероятно, усложнит уничтожение объектов, поскольку на карте будет храниться ссылка. Вам придется вручную вести подсчет ссылок, но вы можете просто использовать std::shared_ptr
, который будет делать такие вещи, как безопасность потоков, а также.
Других решений пока нет …