Zum Beispiel:
- Angenommen, es gibt 10 Räume auf der Welt.
- Nehmen wir an, die Welt wird von 10 Wesenheiten bewohnt.
- Und jede Entität hat ihre eigene "tägliche Routine", in der sie bestimmte Aktionen im Raum ausführt und auch zwischen den Räumen navigiert.
Was ist angesichts der Tatsache, dass sich der Spieler immer nur in einem Raum befinden kann, eine gute Möglichkeit, die Aktionen zu verfolgen, die die anderen Entitäten in anderen Räumen außerhalb des Bildschirms ausführen?
- Am einfachsten ist es, jede der 10 Einheiten in jedem Frame zu überprüfen, ihre Position / ihren Zustand zu überprüfen und zu bestimmen, ob sich die Einheit zu einem bestimmten Zeitpunkt in dem Raum befinden soll, in dem sich der Spieler befindet. (Dies fühlt sich jedoch sehr ressourcenintensiv an, insbesondere wenn die Raum- / Entitätsmenge erhöht wird.)
Eine andere Möglichkeit besteht darin, die seit dem Beginn des Spiels verstrichene Zeit zu verfolgen. Anschließend prüft jede der Einheiten, ob sich ihr Muster mit dem Raum, in dem sich der Spieler befindet, überschneidet, und vergleicht dies mit der Zeit, in der sich der Spieler befindet Entity soll sich zu diesem bestimmten Zeitpunkt im selben Raum befinden. Entities, deren Muster sich nicht mit dem aktuellen Raum überschneiden, in dem sich der Spieler befindet, tun nichts, bis der Spieler einen Raum betritt, in dem sich ihr Muster überschneidet, und berechnen erst zu diesem Zeitpunkt, ob oder nicht sie sollten rendern. (Wenn sie jedoch mit dem Raum interagieren, müssen sie immer den Zustand der Räume überprüfen, die ihre Route kreuzen, um ihren Standort zu diesem Zeitpunkt zu bestimmen, was nicht so toll ist.)
Die dritte Möglichkeit, auf die ich gekommen bin, besteht darin, zunächst nur die Routen zu betrachten, die den Standort des Spielers kreuzen (wie zuvor beschrieben). Zweitens muss beim Betreten eines Raums überprüft werden, ob sich der Spieler in diesem Raum befindet Zustand des Raumes und wie lange wird es dauern, bis der nächste Raum erreicht ist. Zum Beispiel betritt ein Hausmeister-NPC den Raum, überprüft den Zustand des Raums, stellt fest, dass ein Teil des Raums vom Spieler verschüttet wurde, berechnet, wie lange es dauern wird, das aufzuräumen und wie lange der Weg usw. dauert Es ist Zeit, den nächsten Raum zu betreten. Wir prüfen nur, ob der Spieler im Raum ist. Die genaue Position des NPC für Rendering-Zwecke wird nur berechnet, wenn der Spieler den Raum betritt.
Nach einer Weile des Brainstormings bin ich zur dritten Option gekommen, aber ich habe mich gefragt, ob es vielleicht einen bekannten oder besseren Weg gibt, um mit solchen Dingen umzugehen.
quelle
Antworten:
Ein sehr einfacher Ansatz ist die Verwendung von "AI Level of Detail". In etwa bedeutet dies, dass Sie die KI umso häufiger aktualisieren, je näher sie dem Player / der Kamera ist. Sie können auch die Komplexität von KI-Berechnungen reduzieren, die weiter entfernt sind, insb. für die Wegfindung. Wenn der Spieler den Charakter nicht gut oder überhaupt nicht sehen kann, macht es keinen Sinn, viel Mühe in die Simulation des Charakters mit höchster Genauigkeit zu stecken.
In Ihrem Beispiel hat der Raum, in dem sich der Player befindet, möglicherweise die höchste Genauigkeit (AI aktualisiert jeden Frame, volle Auflösung). Die benachbarten Räume erhalten möglicherweise die nächsthöhere Genauigkeit (Aktualisierung alle 10 Ticks, Beseitigung von Pfadglättungen und Animationen). Alle anderen Räume können die geringste Genauigkeit erzielen (Aktualisierung der Pfadfindung mit niedriger Auflösung, Eliminierung nicht notwendiger NPC-zu-NPC-Interaktionen im Sekundentakt).
Größere und komplexere Spiele können (und haben) ähnliche Ansätze verwendet. Sie können Kampfberechnungen vereinfachen, Charaktere teleportieren, anstatt sie zu finden, wenn sie sich bewegen müssen usw.
Wenn Ihr Spiel groß genug ist, dass Sie nicht immer alles im Speicher behalten können, ist es eine gute Lösung, die letzte Aktualisierungszeit in den gespeicherten Daten des Raums zu speichern und die Simulation außerhalb des Bildschirms (mit der niedrigsten Auflösung) abzuspielen Es ist wieder geladen.
Wenn Sie erwarten, dass KI nach einem Zeitplan aus entladenen "schlafenden" Bereichen in "lebende" Bereiche umzieht, möchten Sie entweder Daten mit extrem niedriger Wiedergabetreue erstellen, damit diese Regionen jederzeit im Speicher bleiben (z. B. nur die gröbsten) navmesh detail level und key object / character locations) oder Sie möchten diese Bereiche in regelmäßigen Abständen durchlaufen (z. B. halten Sie X "schlafende" Bereiche im Speicher und simulieren Sie mit geringer Wiedergabetreue mit seltenen Aktualisierungen und führen Sie dann ein Round-Robin-Verfahren durch. " "Bereiche, in denen sich aktive NPCs befinden, entladen und laden Sie Bereiche, während Sie dies tun".
quelle
Ich würde die Entitäten, die sich derzeit in einem Raum befinden, in dieser Rauminstanz speichern, das Raumobjekt würde auch verfolgen, wann welche Entitäten aktualisiert werden müssen (z. B. in einen anderen Raum reisen oder etwas in diesem Raum ändern usw.). Und ich würde auch einen (oder mehrere) Raum pro Sekunde aktualisieren (möglicherweise in einem anderen Thread).
Wenn Sie einen Raum aktualisieren, sollten die NPC-Positionen aktualisiert werden und alle Aktionen, die sie ausgeführt haben und die mit dem Raum seit der letzten Aktualisierung interagieren, sollten ebenfalls behandelt werden. Zuletzt sollte der Zeitpunkt der nächsten erforderlichen Aktualisierung überprüft / aktualisiert werden.
Wenn eine Entität von einem Raum in einen anderen wechselt, sollte ihre Instanz im anderen Raum gespeichert und die nächste Aktualisierung der Entität ebenfalls aktualisiert werden.
Auf diese Weise müssen Sie nur den aktuellen Raum und die Räume, für die zu diesem Zeitpunkt eine Aktualisierung geplant ist, ständig aktualisieren. Die Aktualisierung der anderen Räume ist nur optional. .
quelle