Welche Daten sollten in einem Multiplayer-Server im Verhältnis zu KI und Spielern zwischengespeichert werden?

8

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.

Grimshaw
quelle
Es hängt ziemlich stark von der Anzahl der Spieler und der KI und dergleichen im Spiel ab. Zum Beispiel verwenden MMOs Dinge wie Szenendiagramme für die schnelle Suche, wer in der Nähe von was für Dinge ist, wie Sie oben erwähnt haben, während ein FPS-Spiel, das nur vielleicht 30 Dinge insgesamt verfolgt, übertrieben wäre und nur eine verknüpfte Liste von 30 Entitäten wahrscheinlich ist genug. Können Sie in Ihren Einstellungen etwas genauer sein? Mit nur 5 Spielern und 7 KI würde ich sagen, dass Sie nichts Besonderes tun müssen, außer dass alle 13 Entitäten wie gewohnt in den Speicher geladen werden.
James
Ein absolut durchschnittlicher Fall der Spielwelt ist als solcher: über 20 Regionen, wie in der Stadt plus Umgebung. Jede Region ist das, was wir hier betrachten, und sie ist rekursiv in Bereiche unterteilt, wie Sie sagten. Ein Bereich kann immer noch größer sein als das Bewusstsein der Entität und kann perfekt 100 oder mehr Feinde und JEDE Anzahl von Spielern enthalten. Sicher gibt es leere Bereiche, aber auch überfüllte
Grimshaw
1
Das Feedback zu dieser Frage interessiert mich sehr.
Coyote

Antworten:

7

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.

Kojote
quelle
Ihre Antwort scheint die meisten Methoden zu definieren, die es gibt, fantastisch! Eine Mischung aus allem zu machen, scheint eine gute Wahl zu sein. Für eine solch leistungskritische Anwendung sollte alles im Detail erfolgen, um hier und da einen Overkill zu vermeiden. Ich denke auch wirklich, wenn der Kunde über ALLES maßgeblich ist, kann und wird er betrogen werden: P
Grimshaw
Ja ... aber wenn Sie jetzt einige Dinge an den Client delegieren können, können Sie sie später auf Wunsch an sekundäre Server delegieren, indem Sie die Delegierung nur auf die Server beschränken und auf den Clients deaktivieren. Nur eine Idee :)
Coyote
Es ist eine gute Idee, aber Spieler werden es immer ausnutzen, wenn es wettbewerbsfähig wird ... Ich bin eher dafür, die Client-Verarbeitungsleistung für Augenweiden und andere Dinge zu nutzen, um das Erlebnis, den Sound, die Grafiken usw. zu verbessern. Der Server muss nicht alles verfolgen, einige Dinge, die der Kunde annehmen kann, ohne Betrug zuzulassen. Wie auch immer, vielen Dank für die Antwort, es wird wieder helfen, die Dinge auszugleichen!
Grimshaw