Каковы преимущества использования системы идентификации сущностей?


12

В настоящее время я читаю книгу «Программирование игры AI по примерам».

В книге упоминается о присвоении уникальных идентификационных номеров каждой сущности в игре. Часто , когда объект A необходимо связаться с лицом B , получает ссылку на B , посылая B «s идентификационного номера к EntityDatabase классу. Этот класс получает идентификационные номера и возвращает ссылки на объекты.

Идентификационные номера некоторых сущностей также могут быть получены из файла, содержащего идентификаторы некоторых сущностей (главных игровых персонажей).

Мой вопрос: зачем мне это делать? Почему я не могу работать напрямую со ссылками? Иногда трудно получить прямую ссылку? Является ли использование системы идентификации общим подходом? Есть ли игры, которые не используют идентификаторы?

Я новичок в разработке игр. Пожалуйста, объясните преимущества работы с системой идентификации объекта. Преимущества и недостатки. Конкретные примеры были бы великолепны. Благодарность

Ответы:


18

Ссылки работают хорошо для многих ситуаций. Однако есть три важные ситуации, в которых ссылки не будут работать хорошо:

  • Сеть . При отправке информации о синхронизации состояния объектов по сети ссылки не могут быть использованы. Вам нужно будет каким-то образом идентифицировать сущность, чтобы удаленные машины знали, о ком вы говорите.
  • Сохранение / загрузка . При сохранении состояния вашей игры на диск ссылки на объекты не могут идти с ним. Это означает, что при загрузке состояния объект A, для которого объект B был направлен по ссылке, больше не знает, на кого следует указывать. Места памяти разные, объекты разные.

  • Управление памятью . Наличие центрального места для хранения ссылок означает, что при удалении сущности вам не нужно проходить через все ваши сущности и удалять ссылки на нее для очистки памяти. Ссылки следует использовать только при необходимости, а затем удалять в любом другом объекте. Сокращение количества ссылок гарантирует, что у вас нет сущностей-зомби, на которые ссылается только последняя вещь, с которой они взаимодействовали, или какая-либо другая сущность. Это также помогает избежать нулевых ссылок с помощью стандартного способа тестирования, если объект все еще существует.


2
последний абзац должен быть отдельной точкой (управление памятью). Существуют ситуации, когда одному классу требуется ссылка на другой объект в течение некоторого времени, но ссылка на объект может стать недействительной (т. Е. Целевой объект снаряда умер). Возвращая NULL при запросе сущности по ID, каждый класс берет на себя ответственность делать правильные вещи (а не сбой), когда ссылка на сущность становится недействительной.
LearnCocos2D

Спасибо за ответ. Вопрос для уточнения. В целом: в ситуациях, когда объекту A необходимо получить ссылку на объект B (для того, чтобы атаковать его, отправить ему сообщение, проверить столкновение с ним или любую другую причину) - следует ли мне использовать систему ID для получить его, или иногда можно получить ссылку напрямую? Значение: должен ли объект A всегда получать ссылку от EntityManager, отправляя ему идентификатор объекта B (который ссылается на ссылки на объект и идентификационные номера), и только затем связываться с объектом B, используя ссылку из EntityManager? Должен ли я всегда использовать систему идентификации?
Авив Кон

Или иногда можно получить ссылку напрямую? Другими словами, когда я должен использовать объект A с помощью EntityManager, чтобы получить ссылку, хранящуюся в нем, и когда объект A может получить ссылку на B любыми средствами?
Авив Кон

Там нет реального правильного ответа на это. Лично я хотел бы, чтобы система сущностей была независимой от игровой логики. Это означало бы, что игровая логика даже не имеет доступа к прямым ссылкам на сущности. По сути, я бы избегал поддерживать любую ссылку на сущность за пределами локальной области текущего метода. Это означает, что вы должны использовать EntityManager каждый раз перед работой с компонентами объекта.
MichaelHouse

Понимаю. Позвольте мне использовать пример, чтобы понять, понимаю ли я, что вы имеете в виду. Допустим, я использую равномерную сетку для обнаружения столкновений. Сетка - это двумерный массив. Каждый объект проверяется на столкновение только с объектами в той же «ячейке» в сетке. Используя «обычный» подход, каждая ячейка будет содержать ссылки на объекты GameEntity в области, которую она представляет. Используя подход «система ID», каждая ячейка будет содержать идентификационные номера объектов. Эти номера будут отправлены EntityManager для получения конкретных ссылок для обнаружения столкновений. Это хорошее понимание?
Авив Кон

2

И последнее: если вы используете шаблон «Пул объектов» и объект сбрасывается, потому что существо умерло (например) и появилось в другом месте, ссылка все равно будет указывать на ту же сущность (ошибку), и идентификатор больше не будет оставаться действительный.

Идентификатор 5067 указывает на адрес 0x8765, существо умирает, а другое порождает новый идентификатор существа, сбрасываемый на 7073. Кто-то проверяет идентификатор 5067, он указывает на 0x8765, но это существо теперь зарегистрировано с идентификатором 7073, поэтому база данных идентификаторов сущностей знает, что вы использовали устаревший идентификатор и сообщает, что существо, которого вы пытались достичь, больше не активно.

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.