Quali sono i vantaggi dell'utilizzo di un sistema ID entità?


12

Attualmente sto leggendo il libro Programmazione del gioco AI per esempio.

Il libro menziona l'assegnazione di numeri ID univoci a ciascuna entità del gioco. Spesso quando l'entità A deve contattare l'entità B , A ottiene un riferimento a B inviando il numero ID di B a una classe EntityDatabase . Questa classe riceve i numeri ID e restituisce riferimenti alle entità.

I numeri ID di alcune entità potrebbero anche essere recuperati da un file contenente gli ID di alcune entità (i personaggi principali del gioco).

La mia domanda è: perché dovrei farlo? Perché non posso lavorare direttamente con i riferimenti? A volte è difficile ottenere un riferimento diretto? L'uso di un sistema ID è un approccio comune? Ci sono giochi che non usano ID?

Sono nuovo nello sviluppo di giochi. Spiegare i vantaggi di lavorare con un sistema ID entità. I vantaggi e gli svantaggi. Esempi concreti sarebbero fantastici. Grazie

Risposte:


18

I riferimenti funzionano bene in molte situazioni. Tuttavia, ci sono tre situazioni importanti in cui i riferimenti non funzionano bene:

  • Networking . Quando si inviano informazioni sulla sincronizzazione dello stato delle entità sulla rete, i riferimenti non possono essere utilizzati. Dovrai identificare l'entità in qualche modo in modo che le macchine remote sappiano di chi stai parlando.
  • Salvataggio / caricamento . Quando si salva lo stato del gioco su disco, i riferimenti agli oggetti non possono andare con esso. Ciò significa che quando si carica lo stato, l'Entità A con Entità B targetizzata da un riferimento non sa più a chi rivolgersi. Le posizioni di memoria sono diverse, gli oggetti sono diversi.

  • Gestione della memoria . Avere un posto centrale per archiviare i riferimenti significa che quando si elimina un'entità, non è necessario esaminare tutte le entità e rimuovere i riferimenti ad essa per ripulire la memoria. I riferimenti devono essere utilizzati solo quando necessario, quindi rimossi in qualsiasi altra entità. La riduzione del conteggio dei riferimenti ti assicura di non avere entità zombi a cui fa riferimento solo l'ultima cosa con cui hanno interagito o qualche altra entità. Questo aiuta anche ad evitare riferimenti null con un modo standardizzato di test se un'entità esiste ancora.


2
l'ultimo paragrafo dovrebbe essere un punto a sé stante (gestione della memoria). Ci sono situazioni in cui una classe ha bisogno di un riferimento a un'altra entità per un po 'di tempo, ma il riferimento all'entità può diventare non valido (cioè l'entità bersaglio proiettile è morta). Restituendo NULL quando si richiede un'entità tramite ID, ogni classe si assume la responsabilità di fare la cosa giusta (anziché bloccarla) quando il riferimento all'entità diventa non valido.
LearnCocos2D,

Grazie per aver risposto. Una domanda da chiarire. In generale: nelle situazioni in cui l'entità A deve ottenere un riferimento all'entità B (per attaccarlo, inviargli un messaggio, verificare la collisione con esso o qualsiasi altro motivo) - Devo usare il sistema ID per ottenerlo o a volte va bene ottenere direttamente il riferimento? Significato: l'entità A dovrebbe sempre ottenere il riferimento da EntityManager inviandogli l'ID dell'entità B (che fa riferimento a riferimenti di entità e numeri ID) e solo successivamente contattare l'entità B utilizzando il riferimento da EntityManager? Devo usare sempre il sistema ID?
Aviv Cohn,

O a volte è giusto ottenere il riferimento direttamente? In altre parole, quando dovrei l'entità A utilizzare EntityManager per ottenere il riferimento memorizzato al suo interno e quando l'entità A può recuperare un riferimento a B con qualunque mezzo abbia?
Aviv Cohn,

Non c'è una vera risposta corretta a questo. Personalmente, progetterei il sistema di entità in modo che fosse indipendente dalla logica del gioco. Ciò significherebbe che la logica del gioco non ha nemmeno accesso a riferimenti diretti alle entità. In sostanza, eviterei di mantenere qualsiasi riferimento a un'entità al di fuori dell'ambito locale del metodo attuale. Ciò significa utilizzare EntityManager ogni volta prima di operare sui componenti di un'entità.
MichaelHouse

Vedo. Vorrei usare un esempio per vedere se capisco cosa intendi. Diciamo che sto usando una griglia uniforme per il rilevamento delle collisioni. La griglia è un array 2d. Ogni entità viene controllata per la collisione solo con le entità nella stessa "cella" nella griglia. Usando l'approccio "regolare", ogni cella conterrebbe riferimenti agli oggetti GameEntity nell'area che rappresenta. Utilizzando l'approccio "ID system", ogni cella conterrebbe i numeri ID delle entità. Questi numeri verrebbero inviati a EntityManager per ricevere i riferimenti concreti al fine di eseguire il rilevamento delle collisioni. È una buona comprensione?
Aviv Cohn,

2

Un'ultima cosa è che se stai usando il modello Pool di oggetti e un'entità viene resettata perché la creatura è morta (per esempio) e rigenerata da qualche altra parte, un riferimento rimarrà comunque puntato sulla stessa entità (errore) e un ID non rimarrà più valido.

L'ID 5067 indica che la creatura 0x8765 muore e un altro genera l'ID nuova creatura viene ripristinato a 7073 Qualcuno controlla l'ID 5067, punta a 0x8765 ma quella creatura è ora registrata con l'ID 7073, quindi il database ID entità sa che hai usato un ID obsoleto e ti informa, la creatura che hai cercato di raggiungere non è più attiva.

Questo e tutti i meravigliosi motivi citati da Byte56 sono i motivi per cui è un buon progetto evitare di usare direttamente i riferimenti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.