Quais são os benefícios de usar um sistema de identificação de entidade?

12

Atualmente, estou lendo o livro Programming Game AI By Example.

O livro menciona a atribuição de números de identificação exclusivos para cada entidade no jogo. Freqüentemente, quando a entidade A precisa entrar em contato com a entidade B , A obtém uma referência a B enviando o número de identificação de B para uma classe EntityDatabase . Essa classe recebe números de identificação e retorna referências às entidades.

Os números de ID de algumas entidades também podem ser buscados a partir de um arquivo que contém os IDs de algumas das entidades (os principais personagens do jogo).

Minha pergunta é: por que eu faria isso? Por que não posso trabalhar diretamente com referências? Às vezes é difícil obter uma referência direta? O uso de um sistema de identificação é uma abordagem comum? Existem jogos que não usam IDs?

Eu sou novo no desenvolvimento de jogos. Explique os benefícios de trabalhar com um sistema de identificação de entidade. As vantagens e desvantagens. Exemplos concretos seriam ótimos. obrigado

Aviv Cohn
fonte

Respostas:

18

As referências funcionam bem para muitas situações. No entanto, existem três situações importantes nas quais as referências não funcionam bem:

  • Networking . Ao enviar informações sobre a sincronização do estado das entidades pela rede, as referências não podem ser usadas. Você precisará identificar a entidade de alguma forma para que as máquinas remotas saibam de quem você está falando.
  • Salvando / carregando . Ao salvar o estado do seu jogo em disco, as referências a objetos não podem acompanhá-lo. Isso significa que, quando você carrega o estado, a Entidade A que teve a Entidade B segmentada por uma referência não sabe mais a quem segmentar. Os locais da memória são diferentes, os objetos são diferentes.

  • Gerenciamento de memória . Ter um local central para armazenar referências significa que, ao excluir uma entidade, você não precisa passar por todas as suas entidades e remover referências a ela para que a memória seja limpa. As referências devem ser usadas apenas quando necessário e depois removidas em qualquer outra entidade. A redução da contagem de referências garante que você não tenha entidades zumbis que são referenciadas apenas pela última coisa com que interagiram ou por alguma outra entidade. Isso também ajuda a evitar referências nulas com uma maneira padronizada de testar se uma entidade ainda existe.

MichaelHouse
fonte
2
O último parágrafo deve ser um ponto de bala próprio (gerenciamento de memória). Há situações em que uma classe precisa de uma referência a outra entidade por algum tempo, mas a referência da entidade pode se tornar inválida (ou seja, a entidade alvo do projétil morreu). Ao retornar NULL ao solicitar uma entidade por ID, cada classe assume a responsabilidade de fazer a coisa certa (em vez de travar) quando a referência da entidade se torna inválida.
AprenderCocos2D
Obrigado por responder. Uma pergunta a esclarecer. Em geral: nas situações em que a entidade A precisa obter uma referência à entidade B (para atacá-la, envie uma mensagem, verifique a colisão com ela ou qualquer outro motivo) - Devo usar o sistema de identificação para obtê-lo ou às vezes é bom obter a referência diretamente? Significado: A entidade A sempre deve obter a referência do EntityManager enviando-lhe o ID da entidade B (que faz referência cruzada a referências de entidade e números de ID) e somente então entre em contato com a entidade B usando a referência do EntityManager? Devo sempre usar o sistema de identificação?
Aviv Cohn
Ou às vezes é bom obter a referência diretamente? Em outras palavras, quando devo a entidade A usar o EntityManager para obter a referência armazenada dentro dela e quando a entidade A pode buscar uma referência a B por qualquer meio que possua?
Aviv Cohn
Não existe uma resposta correta real para isso. Pessoalmente, eu projetaria o sistema de entidades para ser independente da lógica do jogo. Isso significaria que a lógica do jogo nem sequer tem acesso a referências diretas a entidades. Essencialmente, eu evitaria manter qualquer referência a uma entidade além do escopo local do método atual. Isso significa usar o EntityManager todas as vezes antes de operar nos componentes de uma entidade.
MichaelHouse
Entendo. Deixe-me usar um exemplo para ver se entendo o que você quer dizer. Digamos que estou usando uma grade uniforme para fazer a detecção de colisões. A grade é uma matriz 2D. Cada entidade é verificada quanto à colisão apenas com as entidades na mesma 'célula' na grade. Usando a abordagem "regular", cada célula manteria referências aos objetos GameEntity na área que representa. Usando a abordagem "sistema de identificação", cada célula armazenaria os números de identificação das entidades. Esses números seriam enviados ao EntityManager para receber as referências concretas para realizar a detecção de colisão. Essa é uma boa compreensão?
Aviv Cohn
2

Uma última coisa é que se você estiver usando o padrão Pool de Objetos e uma entidade for redefinida porque a criatura morreu (por exemplo) e reapareceu em outro lugar, uma referência ainda apontará para a mesma entidade (falha) e um ID não permanecerá mais válido.

O ID 5067 aponta para o endereço 0x8765, a criatura morre e outro gera o novo ID da criatura é redefinido para 7073 Alguém verifica o ID 5067, mas aponta para 0x8765, mas agora a criatura está registrada com o ID 7073, para que o banco de dados de ID da entidade saiba que você usou um ID obsoleto e informa que a criatura que você tentou alcançar não está mais ativa.

Essa e todas as maravilhosas razões mencionadas pelo Byte56 são por que é um bom design evitar o uso de referências diretamente.

AturSams
fonte