Was sind die Vorteile eines Entity-ID-Systems?

12

Ich lese gerade das Buch Programming Game AI By Example.

In dem Buch wird erwähnt, wie jeder Entität im Spiel eindeutige ID-Nummern zugewiesen werden. Wenn die Entität A die Entität B kontaktieren muss , erhält A häufig einen Verweis auf B, indem die ID-Nummer von B an eine EntityDatabase- Klasse gesendet wird . Diese Klasse erhält ID-Nummern und gibt Verweise auf die Entitäten zurück.

Die ID-Nummern einiger Entitäten können auch aus einer Datei abgerufen werden, die die IDs einiger Entitäten (die Hauptfiguren des Spiels) enthält.

Meine Frage ist: Warum sollte ich das tun? Warum kann ich nicht direkt mit Referenzen arbeiten? Ist es manchmal schwierig, eine direkte Referenz zu bekommen? Ist die Verwendung eines ID-Systems ein gängiger Ansatz? Gibt es Spiele, die keine IDs verwenden?

Ich bin neu in der Spieleentwicklung. Bitte erläutern Sie die Vorteile der Arbeit mit einem Entity-ID-System. Die Vor-und Nachteile. Konkrete Beispiele wären toll. Vielen Dank

Aviv Cohn
quelle

Antworten:

18

Referenzen funktionieren in vielen Situationen gut. Es gibt jedoch drei wichtige Situationen, in denen Referenzen nicht gut funktionieren:

  • Vernetzung . Beim Senden von Informationen zum Synchronisieren des Status von Entitäten über das Netzwerk können keine Referenzen verwendet werden. Sie müssen die Entität auf irgendeine Weise identifizieren, damit die Remotecomputer wissen, über wen Sie sprechen.
  • Speichern / Laden . Wenn Sie den Status Ihres Spiels auf der Festplatte speichern, können die Objektreferenzen nicht damit übereinstimmen. Das heißt, wenn Sie den Status laden, weiß Entität A, auf die Entität B durch eine Referenz abgezielt wurde, nicht mehr, auf wen sie abzielen soll. Die Speicherorte sind unterschiedlich, die Objekte sind unterschiedlich.

  • Speicherverwaltung . Wenn Sie einen zentralen Ort zum Speichern von Referenzen haben, müssen Sie beim Löschen einer Entität nicht alle Entitäten durchgehen und Referenzen darauf entfernen, damit der Speicher bereinigt wird. Referenzen sollten nur bei Bedarf verwendet und dann in einer anderen Entität entfernt werden. Durch das Reduzieren der Referenzanzahl wird sichergestellt, dass Sie keine Zombie-Entitäten haben, auf die nur durch die letzte Interaktion mit ihnen oder durch eine andere Entität verwiesen wird. Dies hilft auch, Nullreferenzen durch eine standardisierte Testmethode zu vermeiden, wenn eine Entität noch vorhanden ist.

MichaelHouse
quelle
2
Der letzte Absatz sollte ein eigener Aufzählungspunkt sein (Speicherverwaltung). Es gibt Situationen, in denen eine Klasse für einige Zeit eine Referenz auf eine andere Entität benötigt, die Entitätsreferenz jedoch ungültig wird (dh die Zielentität des Projektils ist gestorben). Wenn beim Anfordern einer Entität anhand der ID NULL zurückgegeben wird, übernimmt jede Klasse die Verantwortung, das Richtige zu tun (anstatt einen Absturz zu verursachen), wenn die Entitätsreferenz ungültig wird.
LearnCocos2D
Danke für die Antwort. Eine zu klärende Frage. Im Allgemeinen: In Situationen, in denen Entität A einen Verweis auf Entität B erhalten muss (um sie anzugreifen, eine Nachricht zu senden, eine Kollision mit ihr zu überprüfen oder aus irgendeinem anderen Grund) - Soll ich das ID-System verwenden, um Erhalten Sie es, oder ist es manchmal in Ordnung, die Referenz direkt zu erhalten? Bedeutung: Soll die Entität A immer die Referenz vom EntityManager erhalten, indem sie die ID der Entität B sendet (die Entitätsreferenzen und ID-Nummern miteinander in Verbindung bringt), und erst dann die Entität B unter Verwendung der Referenz vom EntityManager kontaktieren? Soll ich immer das ID-System verwenden?
Aviv Cohn
Oder ist es manchmal in Ordnung, die Referenz direkt zu erhalten? Mit anderen Worten, wann sollte ich Entität A verwenden, um die darin gespeicherte Referenz zu erhalten, und wann kann Entität A eine Referenz auf B mit welchen Mitteln auch immer abrufen?
Aviv Cohn
Darauf gibt es keine wirklich richtige Antwort. Persönlich würde ich das Entitätssystem so gestalten, dass es von der Spielelogik unabhängig ist. Das würde bedeuten, dass die Spielelogik nicht einmal Zugriff auf direkte Entitätsreferenzen hat. Grundsätzlich würde ich es vermeiden, Verweise auf eine Entität außerhalb des lokalen Geltungsbereichs der aktuellen Methode beizubehalten. Dies bedeutet, dass Sie den EntityManager jedes Mal verwenden müssen, bevor Sie mit den Komponenten einer Entität arbeiten.
MichaelHouse
Aha. Lassen Sie mich anhand eines Beispiels sehen, ob ich verstehe, was Sie meinen. Angenommen, ich verwende ein einheitliches Raster für die Kollisionserkennung. Das Gitter ist ein 2D-Array. Jede Entität wird nur mit den Entitäten in derselben 'Zelle' im Raster auf Kollision geprüft. Bei Verwendung des "regulären" Ansatzes würde jede Zelle Verweise auf die GameEntity-Objekte in dem Bereich enthalten, den sie darstellt. Bei Verwendung des "ID-System" -Ansatzes würde jede Zelle die ID-Nummern der Entitäten enthalten. Diese Nummern werden an den EntityManager gesendet, um die konkreten Referenzen für die Kollisionserkennung zu erhalten. Ist das ein gutes Verständnis?
Aviv Cohn
2

Eine letzte Sache ist, dass, wenn Sie das Objektpoolmuster verwenden und eine Entität zurückgesetzt wird, weil die Kreatur gestorben ist (zum Beispiel) und an einer anderen Stelle wieder auftaucht, ein Verweis immer noch auf dieselbe Entität verweist (Fehler) und eine ID nicht mehr verbleibt gültig.

ID 5067 zeigt auf Adresse 0x8765 Kreatur stirbt und eine andere neue Kreaturen-ID wird auf 7073 zurückgesetzt. Jemand sucht nach ID 5067, zeigt auf 0x8765, aber diese Kreatur ist jetzt mit der ID 7073 registriert, sodass die Entitäts-ID-Datenbank weiß, dass Sie eine veraltete ID und verwendet haben informiert dich, dass die Kreatur, die du zu erreichen versucht hast, nicht mehr aktiv ist.

Das und all die wunderbaren Gründe, die Byte56 genannt hat, sind, warum es ein gutes Design ist, Referenzen nicht direkt zu verwenden.

AturSams
quelle