Lokale Listen für jedes System erhöhen die Speichernutzung für Klassen.
Es ist ein traditioneller Raum-Zeit-Kompromiss .
Während das Durchlaufen aller Entitäten und das Überprüfen ihrer Signaturen direkt zum Code führt, kann es mit zunehmender Anzahl von Systemen ineffizient werden. Stellen Sie sich ein spezialisiertes System vor (lassen Sie es eingeben), das unter Tausenden von nicht verwandten Entitäten nach seiner wahrscheinlich einzigen interessierenden Entität sucht .
Trotzdem kann dieser Ansatz abhängig von Ihren Zielen immer noch gut genug sein.
Wenn Sie sich Sorgen um die Geschwindigkeit machen, sollten Sie natürlich auch andere Lösungen in Betracht ziehen.
Sollte jedes System eine lokale Liste von Entitäten enthalten, an denen sie interessiert sind?
Genau. Dies ist ein Standardansatz, der Ihnen eine anständige Leistung bieten sollte und relativ einfach zu implementieren ist. Der Speicheraufwand ist meiner Meinung nach vernachlässigbar - wir sprechen über das Speichern von Zeigern.
Nun, wie diese "Listen von Interesse" zu pflegen sind, mag nicht so offensichtlich sein. Was den Datencontainer betrifft, std::vector<entity*> targets
ist die Klasse innerhalb des Systems vollkommen ausreichend. Was ich jetzt mache, ist Folgendes:
Das Entfernen einer Entität ist völlig analog, mit dem einzigen Unterschied, den wir entfernen, wenn ein System mit unserer aktuellen Signatur übereinstimmt (was bedeutet, dass die Entität vorhanden war) und nicht mit der neuen Signatur übereinstimmt (was bedeutet, dass die Entität nicht mehr vorhanden sein sollte ).
Jetzt können Sie die Verwendung von std :: list in Betracht ziehen, da das Entfernen aus dem Vektor O (n) ist, ganz zu schweigen davon, dass Sie jedes Mal, wenn Sie aus der Mitte entfernen, einen großen Datenblock verschieben müssten. Eigentlich müssen Sie das nicht - da uns die Verarbeitungsreihenfolge auf dieser Ebene egal ist, können wir einfach std :: remove aufrufen und damit leben, dass wir bei jedem Löschen nur eine O (n) -Suche nach unserer durchführen müssen zu entfernende Entität.
std :: list würde Ihnen O (1) entfernen geben, aber auf der anderen Seite haben Sie ein bisschen zusätzlichen Speicheraufwand. Denken Sie auch daran, dass Sie die meiste Zeit Entitäten verarbeiten und nicht entfernen - und dies wird mit std :: vector sicherlich schneller erledigt.
Wenn Sie sehr leistungskritisch sind, können Sie auch ein anderes Datenzugriffsmuster in Betracht ziehen , aber in beiden Fällen führen Sie eine Art "Listen von Interesse". Denken Sie jedoch daran, dass es kein Problem sein sollte, die Entitätsverarbeitungsmethoden des Systems zu verbessern, wenn Ihre Framerate aufgrund dieser Abstraktionen so stark abstrahiert bleibt. Wählen Sie daher zunächst die Methode, die für Sie am einfachsten zu codieren ist dann profilieren und bei Bedarf verbessern.