Welche Daten sollten an einem virtuellen, vollständig netzwerkgesteuerten Ort mit einer beliebigen Anzahl von Spielern und einer beliebigen Anzahl von Feinden im Serverspeicher zwischengespeichert werden, um eine reibungslose KI-Simulation zu optimieren?
Nehmen wir an, Spieler A sieht Spieler B bis E und Feind A bis G. Jeder dieser Spieler sieht Spieler A, aber nicht unbedingt einander. Gleiches gilt für Feinde. Stellen Sie sich diese Frage bitte von oben nach unten vor.
In vielen Fällen, zum Beispiel wenn ein Spieler auf seine Waffe schießt, behandelt der Server den Ton als radiales "Signal", das jede andere in Reichweite befindliche Entität "hört" und auf das sie reagiert.
Diese Suche ständig für ein ganzes Gebiet durchzuführen, das möglicherweise viele nicht verwandte Spieler und Feinde enthält, scheint ein Problem zu sein, wenn das Budget für jeden KI-Agenten so klein ist.
Sollte jede Entität alles zwischenspeichern, was aus ihrem Bewusstseinsradius ein- und austritt? Gibt es eine großartige Möglichkeit, die in der Nähe befindlichen Entitäten zu verfolgen, ohne den Speicher mit solchen Caches zu überfluten?
Was ist mit anderen AI-bezogenen Problemen, die auftreten können, nachdem angenommen wurde, dass das vorherige Problem gut funktioniert? Wir sprechen von Umgebungen mit möglicherweise Hunderten von Feinden, einem Schwarm.
quelle
Antworten:
Es gibt mehrere Möglichkeiten, dies zu tun, aber sie hängen davon ab, wo immer Sie eine große Anzahl von Interaktionen oder eine sehr dichte Population haben.
Wenn Sie möchten, dass Ihre Simulation eine gute Genauigkeit aufweist, müssen Sie leider die meisten Ereignisse verarbeiten, die von allen Akteuren generiert wurden, und alle / die meisten Akteure finden, die benachrichtigt werden müssen.
Günstige Flächenkollisionen
Wenn Sie das Problem mit Bewusstseinsbereichen betreffen, können Sie es mithilfe einer einfachen Kollisionserkennung lösen.
In einer 2D-Welt ist die Kollisionserkennung auf Kreisen "billig". Zum Beispiel benötigt die Operation zum Erkennen, ob sich ein Punkt in einem Kreis befindet, nur 2 Subtraktionen, 2 Multiplikationen und eine Addition. Sie müssen die Quadratwurzel nicht erstellen, da Sie den Quadratradius Ihrer Fläche direkt mit dem Quadratabstand speichern und vergleichen können.
Wenn Sie den 2D-Kreis in einer 3D-Welt verwenden, funktioniert er im Grunde genommen als Zylinder. Es kann eine bequeme Möglichkeit sein, Bereiche zu erstellen, wenn die Höhe nicht sehr wichtig ist.
Ereignisorientierter Radius
Wenn die Anzahl der Ereignisse (Feuergefecht, Bewegung ...) gering ist, können Sie versuchen, jeden von jedem Ereignis betroffenen Akteur zu erkennen. Ihre Veranstaltungen erzeugen Bereiche (in denen sie zu hören sind).
Dies ist die am einfachsten zu implementierende Methode und auch die flexibelste, da Sie Einschläge von Kugeln / Projektilen erfassen können, die von Akteuren außerhalb eines Bewusstseinsbereichs stammen.
Wenn andererseits das Ereignisvolumen zunimmt, müssen Sie möglicherweise entweder die Anzahl der Ereignisse reduzieren, die Bereichs-Scans auslösen, oder die Anzahl der pro Ereignis gescannten Akteure verringern.
-> Sie können auch kleine (Ereignis-) Zonen erstellen, in denen alle Ereignisse zusammen registriert und in großen Mengen verarbeitet werden (dh 2 Aufprallgeschosse und ein Fußschritt in einer Zone verwenden nur einen Scan und werden an alle betroffenen Entitäten gesendet). <-
Schauspielerorientierte Bereiche
Sie können das Prinzip "Bewusstseinsbereich" verwenden. IE Wenn ein Akteur mit dem Bewusstseinsbereich (Kreis) eines anderen Akteurs kollidiert, fügen Sie den kollidierenden Akteur einfach einer Liste potenziell interagierender Akteure hinzu. Abhängig davon, wie Ihre Engine aufgebaut ist, können Sie sich dann für Soundnachrichten und andere Ereignisse registrieren, die von den Akteuren in der Liste stammen.
Um nach visuellem Kontakt zu suchen, können Sie Ihre visuellen Scans auch nur in der Liste der registrierten Schauspieler durchführen.
Sie müssen nicht bei jedem Tick nach Änderungen des Bewusstseinsbereichs suchen. Sie können dies von Zeit zu Zeit tun, beispielsweise alle 5 bis 30 Ticks.
Wenn die Listen wachsen, können Sie sie auf eine maximale Größe beschränken. Aber dann müssen Sie die Akteure priorisieren, um sie in die Listen aufzunehmen / auszutauschen.
Gemischter Ansatz
Sie können beide Ansätze mischen. Sie können Akteure in Bewusstseinsbereichen für Ereignisse wie Fußschritte, Motornasen usw. registrieren. Andere Ereignisse (Projektileinschläge, Explosionen usw.) können je nach ihrer Bedeutung Scans auslösen. Es besteht eine viel höhere Wahrscheinlichkeit, dass jemand eine Granatenexplosion hört als ein Kugelaufprall. Daher sollte die Granatenexplosion einen umfassenderen Scan auslösen als der Kugelaufprall.
Ich würde empfehlen, zuerst mit der Implementierung des Ereignisradius zu beginnen. Sobald dies funktioniert und Sie in der Lage sind, die Präzision dieser Methode nach Belieben zu verringern / zu erhöhen, können Sie mit der Implementierung der Bewusstseinsbereiche für Akteure beginnen. Auf diese Weise können Sie einige Ereignisse auf das zweite System verschieben.
Kontextpools
Nicht alle Akteure müssen über alle Ereignisse informiert werden. Zum Beispiel muss ein Flugabwehrrevolver nicht über Aufprallgeschosse und Fußschritte um ihn herum benachrichtigt werden, selbst das Vorhandensein von Bodeneinheiten könnte für einige Einheiten ignoriert werden.
Wenn Sie viele solcher Sonderfälle finden, können Sie verschiedene Pools von Bewusstseinsbereichen erstellen. Ein Schauspieler kann seinen Bewusstseinsbereich in mehreren Pools aktivieren. Beispielsweise möchten Sie möglicherweise, dass Ihre Bodeneinheiten nur auf Bodeneinheiten reagieren, während einige mit Raketen und Lasern ausgestattete Einheiten auch auf Lufteinheiten reagieren können. Flugzeuge müssen niemals über andere Bodeneinschläge als Explosionen informiert werden ...
Natürlich müssen Sie nicht mehrere "Listen" für die Pools erstellen. Sie können einfach eine Bitmaske verwenden und die richtige Maske für jeden Akteur / Bereich festlegen. Auf diese Weise können Sie mit einem einfachen oder vor dem Überprüfen der Entfernung filtern.
Anhäufung
Wenn Sie sehen, dass die Listen in jedem Bewusstseinsbereich wachsen und das Gedächtnis knapp ist, können Sie Bewusstseinsbereiche für Gruppen von Feinden (Teams, Trupps, Züge, Herden, Schwärme ...) zusammenfassen, solange diese nahe beieinander bleiben. Auf diese Weise kann sich ein ganzer Kader für Veranstaltungen oder andere Akteure / Gruppen registrieren, die seinen Bewusstseinsbereich betreten.
Grundsätzlich wird die Gruppenentität zu einem Ersatz / Proxy für alle Scans, während alle Mitglieder der Gruppe aus den Pools entfernt werden.
Dieses Prinzip kann auch auf alle Einheiten in einem Fahrzeug angewendet werden.
Annäherungsaktivierungen
Wenn der Server wirklich mit Bots überfüllt ist (und Sie wirklich alle am Leben erhalten müssen), können Sie das Bewusstsein / die KI nur für diejenigen in einem speziellen "Aktivierungsbereich um jeden Spieler" aktivieren. Auf diese Weise bleiben Bots (oder Gruppen) in einem oder mehreren Aktivierungsbereichen selbst und ihr Bewusstseinsbereich aktiviert (im Kollisionspool). Andernfalls wird ihr Bewusstseinsbereich aus den Pools der aktiven Bereiche entfernt.
Die Häufigkeit, mit der diese "Aktivierungsbereiche" nach "Bewusstseinsbereichen" suchen, kann je nach Geschwindigkeit des Spielers variieren. Ein Spieler, der mit höherer Geschwindigkeit reist, löst mehr Aktivierungen aus als ein Spieler, der in einer Zone kampiert (mindestens erforderlich, um Roaming-Bots zu aktivieren und Bots zu deaktivieren, die das Gebiet verlassen).
Sie können auch den Aktivierungsbereich eines Spielers deaktivieren, wenn er in ein Fahrzeug einsteigt, und dem Fahrzeug einen Aktivierungsbereich zuweisen, wenn es keinen hat. Auf diese Weise müssen 10 Spieler, die im selben Fahrzeug fahren, nicht über 10 Aktivierungsbereiche verfügen.
Delegation
Wenn Sie keine Angst vor Betrügern und anderen Unruhestiftern haben, können Sie einen Teil der Ereigniserkennung an die Clientanwendung delegieren.
Der Server kann regelmäßig eine Liste der in der Nähe befindlichen Akteure (Bots und Spieler) senden, die von Client-Apps benachrichtigt werden. Die Client-Anwendung muss das Scannen und die Ereigniserkennung für alle vom Player generierten Ereignisse durchführen. Das kann zum Beispiel die Liste der Schauspieler senden, um über einen Schuss, einen Kugelaufprall oder Fußschritte zu informieren.
Dies ist eine Option, die je nach Art des Spiels gültig sein kann. Dies ist eine theoretische Idee, und ich würde dies nicht empfehlen, bis Sie die volle Kontrolle über die delegierten Clients (Bot-Server oder gesicherte Clients) haben.
Ich hoffe das hilft.
quelle