Effiziente Lösung für die Mehrspieler-Partitionierung?

10

Diese Frage ist etwas knifflig, aber ich werde versuchen, sie klar zu machen.

Nehmen wir an, ich baue ein Online-Spiel (nicht im MMO-Maßstab), aber das unterstützt so viele Spieler wie möglich in einem autorisierenden Server-Ansatz. Ich möchte wirklich große Welten mit vielen KI-simulierten Feinden.

Mir sind einige Strategien bekannt, um Server-CPU zu sparen, indem der Speicherplatz unterteilt und nicht verarbeitet wird, was nicht verarbeitet werden muss. Ich habe die Welt bereits nach Regionen aufgeteilt, die Ladezeiten und kleine Übergänge erfordern. Dies ist meiner Meinung nach wichtig, um die Qualität des Spiels beim Spielen vor Ort (allein oder sogar mit ein paar Freunden) aufrechtzuerhalten. Ich erwarte nicht, dass sich die Spieler in mehr als einer oder zwei Regionen befinden.

Das Problem ist, dass eine Region ziemlich groß werden kann und viele NPCs gleichzeitig simulieren. Wie gehe ich damit um, ohne die Erfahrung der Spieler zu beeinträchtigen? Ansätze wie ein Server pro Region und dergleichen sind nicht in der Tabelle enthalten.

Ich suche hauptsächlich nach Datenstrukturen, um Horden von Feinden und sogar friedlichen NPCs zu halten. Um die Frage abzuschließen, beachten Sie bitte, dass Fahrzeuge vorhanden sind. Daher ist es sehr schnell, innerhalb einer Region zu fahren, was das "Wann" zum Ausmerzen von Bereichen beeinflusst.

Grimshaw
quelle
Sind Sie auf nur einen physischen Server beschränkt?
Patrick Hughes
Letztendlich nein. Aber der Einfachheit und Erreichbarkeit halber kann ich das Projekt vorerst nicht noch komplizierter machen :)
Grimshaw
Fangen Sie einfach an. So etwas wie WoW, das auf mehreren physischen Boxen pro "Server" ausgeführt wird, teilt ihre Welt einfach in ein Raster auf und alle Aktualisierungen basieren darauf, wer sich in denselben Boxen wie Sie befindet. Sehr einfach, leicht zu optimieren, funktioniert gut und Sie können es mit nur einer Box verwenden, um die Verarbeitung zu steuern.
Patrick Hughes
Ich stimme Ihrem Standpunkt voll und ganz zu, und vielleicht habe ich etwas in meiner Frage verpasst. Was ist, wenn sich ein Spieler ganz rechts in der Boxzelle und ein anderer ganz links in der rechten Nachbarzelle befindet? Sie sollten sich sehen! Die Welt sucht weiterhin nach einem Spiel wie WoW. Das verstehe ich nicht, wie man ein kontinuierliches Weltraster erstellt und es gleichzeitig effizient hält. Sicher gibt es Situationen, in denen sich Spieler von zwei "Servern" sehen sollten :)
Grimshaw
1
Und ja, wenn Sie sowohl eine Menge Sachen überall als auch viele Spieler überall haben wollen, müssen Sie wirklich planen, dass alles überall und jederzeit aktiv ist, kein magischer Weg daran vorbei. Dies ist der Grund, warum einzelne Boxen einer MMO-Servergruppe nur maximal 200-500 Spieler bedienen UND warum MMO AI für NPCs erbärmlich dumm ist (auch bekannt als billig zu berechnen).
Patrick Hughes

Antworten:

5

Soweit ich weiß, wird auf Ihrem Server eine Art Physik ausgeführt.

In diesem Fall stehen für die KI / Physik neben der Raumpartitionierung auch andere Techniken zur Verfügung. Von den meisten zu weniger offensichtlichen:

  • Priorität: NPCs ohne direkte Interaktion mit Spielern können weniger CPU-Zeit erhalten, indem sie ihre Aktualisierungsrate senken. Sie können Prioritätswarteschlangen verwenden und Warteschlangen mit der höheren Priorität vom ersten bis zum letzten ausführen, während andere Warteschlangen in jedem Zyklus nur 1/2, 1/4 oder 1/8 der Warteschlange ausführen. Auf diese Weise stellen Sie sicher, dass jedes Objekt irgendwann ausgeführt wird, reduzieren jedoch die CPU-Belastung.
  • Die Physik kann auch abgesenkt werden (nur die Kollisionsboxen und Kugeln können beim Roaming und außerhalb der Sichtweite verwendet werden).
  • Vereinfachung der KI / Simulation durch Zuweisung sehr grundlegender Verhaltensweisen zu NPCs und Umgebung, während die Spieler weit weg sind. Normalerweise streift es oder sucht nach Feinden, anstatt zu jagen, zu sammeln, zu bewirtschaften ...
  • Einige Physik- und KI-Funktionen können auch an die Kunden delegiert werden. Wenn Ihnen auf den Servern wirklich die CPU fehlt, können Sie das Objekt als teilweise aufgelöst markieren, und die Clients passen die Physik und Position dieser Objekte lokal an (um schwebende NPCs zu vermeiden). Den Kunden kann eine gewisse Verantwortung beim Ausführen der KI übertragen werden (während des Kampfes gegen einen Spieler kann das Gerät des Zielspielers die angreifenden NPCs direkt ausführen).
  • Für Spieler kann die Physik auch auf dem Server gesenkt werden, und Clients erhalten mehr Verantwortung bei der Kollisionsauflösung. Beispiel: Wenn Sie mit Ihrem Fahrzeug auf ein Objekt treffen, löst der Server nur die Kollision auf den Kollisionsfeldern und markiert die Objekte als potenziell kollisionsgefährdet. Der Client sendet die Auflösung mit einem Zeitstempel an den Server, der sie akzeptiert, wenn die Objekte markiert sind und die Lösung richtig erscheint.

Sobald Sie diese Mechanismen implementiert haben, können Sie entscheiden, wie viel und wie oft Sie sie benötigen. Das Tolle daran ist, dass Sie später einige Server hinzufügen können, die einige der Aufgaben anstelle der Client-Apps übernehmen können.

Natürlich führt die ungefähre Kollisionserkennung zu einigen Aberrationen, aber Sie können diese lösen, indem Sie von Zeit zu Zeit mehr Präzision hinzufügen.

Auch in Bezug auf die Physik sollten Sie sich Bibliotheken ansehen, die eine Art GPGPU- System wie OpenCL oder CUDA unterstützen, wenn Sie Zugriff auf einen Server haben, der beides unterstützt.

Kojote
quelle
Das Kombinieren der Raumaufteilung einer Region mit Prioritätsaktualisierungen sollte genau das sein, was ich brauche, optimal für wenige Spieler und dennoch optimiert, wenn viele Bereiche geladen sind. Vielen Dank.
Grimshaw
@ DevilWithin Es sollte helfen, und es erfordert keine Änderungen auf der Clientseite. Ich habe der Antwort noch einige Details hinzugefügt.
Coyote
Die vereinfachte KI ist eine wunderbare Idee. Während die NPC weit von den Spielern entfernt sind, müssen sie in den meisten Fällen nichts anderes tun, als sich zu bewegen. Das heißt, ich kann alle 1 Minute oder so etwas eine Annäherung an das machen, was sie vorhaben, nur um sie um die Welt streifen zu lassen. Wenn sie sich als Zombies vorstellen, würden sie es tun!
Grimshaw