Angenommen, Sie haben ein Spiel, in dem es viele (viele, viele) Entitäten gibt, die einige Funktionen erfüllen, von denen nicht alle ständig benötigt werden oder in jedem Frame berücksichtigt werden müssen. Das konkrete Problem, an dem ich arbeite, ist eine detaillierte Simulation eines Körpers einschließlich seiner Organe.
Im Spiel hat jede Kreatur ihren eigenen Körper, der in kleinere Teile (Rumpf, Beine usw.) unterteilt ist. Manchmal enthalten diese Teile Organe, die eine bestimmte Funktion im Körper erfüllen. Ob ein Organ derzeit einem Zweck dient oder aktiv ist, ist eigentlich nie klar. Schließlich hat ein Tier möglicherweise einen leeren Magen, der daher nichts zu verdauen braucht. Es wäre ziemlich lächerlich, jedes Objekt in jedem Frame zu überprüfen oder zu simulieren, und es wäre sehr kostspielig, sobald Sie viele Kreaturen auf der Welt haben. Also überlegte ich, wie ich intelligent zwischen Objekten, die aktualisiert werden müssen, und solchen, die nicht aktualisiert werden müssen, unterscheiden kann.
Was ich mir ausgedacht habe, scheint zumindest eine gute Lösung zu sein. Es wird eine einfache Warteschlange / ein einfacher Stapel erstellt (wesentlich ist, dass jedes Element entfernt wird, sobald es gelesen wird; die Reihenfolge ist irrelevant), der so genannte "Aufmerksamkeitsstapel", in dem sich Objekte befinden, die simuliert werden müssen. Objekte, die Aufmerksamkeit benötigen, legen sich einfach auf den Stapel oder werden von anderen Objekten dort abgelegt. Diese Objekte würden wahrscheinlich eine einfache Schnittstelle mit einer simulate () - Funktion implementieren.
Angewandt auf mein bisheriges Aufschlussbeispiel würde dies bedeuten:
Der Spieler wählt aus dem Inventar etwas zu essen (angenommen, es ist Brot) und legt es in den Mund seines Charakters und der Mund wird auf den Aufmerksamkeitsstapel gelegt. Im nächsten Frame wird der Mund vom Stapel genommen und seine simulate () - Funktion aufgerufen. Da es ein Mund ist, wäre es vernünftig, hier das Kauen zu simulieren. Dies kann einige Frames dauern, in denen sich der Mund weiter auf den Stapel legt, bis entschieden wird, dass das Essen zum Schlucken bereit ist. In diesem Fall gibt der Mund das gekaute Brot in den Magen (ich weiß, es geht nicht direkt dorthin, aber die Speiseröhre wird zur Vereinfachung weggelassen), der dann ebenfalls auf den Aufmerksamkeitsstapel gelegt wird. Im nächsten Frame wird die Simulation des Aufschlussprozesses gestartet. Und so weiter für den Rest der notwendigen Organe.
Ein vorhersehbares Problem dabei sind im Leerlauf befindliche Objekte. Ein schlafendes Tier ist ein gutes Beispiel dafür. Dies könnte wie zuvor beschrieben geschehen, indem das schlafende Tier auf dem Stapel gehalten und jedes Mal überprüft wird, ob es aufgeweckt werden muss. Dies erscheint jedoch verschwenderisch, da dies das einzige ist, was getan wird. Um im Leerlauf befindliche Objekte effizienter zu gestalten, wollte ich eine Art Zeitplan hinzufügen, in dem zu einem bestimmten Zeitpunkt auszuführende Jobs gespeichert werden. Wenn ein Tier einschlafen würde, würde es einen Job auf diesen Zeitplan setzen, der für eine bestimmte Zeitspanne nach dem Einschlafen des Tieres geplant wäre. Dieser Job würde sich dann darum kümmern, das schlafende Tier wieder auf den Aufmerksamkeitsstapel zu legen. Nun könnte man sagen, dass ein schlafendes Tier, das nicht auf dem Aufmerksamkeitsstapel steht, nicht von etwas angegriffen werden kann, weil seine KI nicht simuliert wird.
Ich weiß ehrlich gesagt nicht, ob dies aufgrund mangelnder Erfahrung auch nur annähernd eine elegante Lösung für dieses Problem ist. Bin ich in der Nähe von etwas brauchbarem? Wie wird das normalerweise gemacht oder hat jemand Vorschläge oder bessere Lösungen?