Speichern der Koordinaten jedes Objekts auf der Serverseite in MMOs

12

In einem MMORPG:

Ist es typisch oder machbar, die Koordinaten jedes Baums, Buschgesteins usw. auf der Serverseite für die Kollisionserkennung zu speichern?

Wenn ja, was wäre ein praktikabler Weg, um eine so große Anzahl von Koordinaten zu speichern (Datenstrukturen und Behandlung von Leistungsproblemen)?

Wenn nicht, erfolgt diese Art der Kollisionserkennung vollständig auf der Clientseite, ohne dass der Server dies überprüft?

Oder gibt es einen Mittelweg, bei dem der Client die Kollision überprüft und der Server überprüft? Wenn ja, wie würde der Server dies überprüfen, ohne auch die Koordinaten im Server zu behalten?

Sajith Dilshan Jamal
quelle
2
Ich weiß nicht genug darüber, um eine gute Antwort zu geben, aber wenn Sie die Kollisionserkennung nur auf der Client-Seite durchführen, finden Betrüger einen Weg, alles zu durchschneiden oder Power-Ups aufzunehmen, die kilometerweit von ihnen entfernt sind.
Peethor
2
-1 "Frage zeigt keinen Forschungsaufwand".
Vaillancourt
tatsächlich, wahrscheinlich kein Duplikat, erfuhr ich von räumlichen Partitionsschemata und räumlichen Datenstrukturen, die die andere Frage nicht hatte
Sajith Dilshan Jamal

Antworten:

15

Unabhängig von der Machbarkeit (ja, abhängig vom Maßstab) gibt es oft bessere oder einfachere Wege.

In einem typischen MMO muss der Server beispielsweise nur die grobe Navigationskarte kennen, die von der KI und der Pfadfindung der Spieler verwendet wird. Anstatt die Position eines Baums zu speichern, können Sie stattdessen einfach ein Loch in die Navmap an der Position des Baums schneiden. Ebenso für alle anderen großen Hindernisse.

Selbst Spiele, bei denen eine eingehendere Kollisionserkennung erforderlich ist, können häufig in eine server- und clientseitige Erkennung unterteilt werden. Der Server kann sich nur um grobe Pfade kümmern, während der Client eine animationsempfindlichere Kollisionserkennung durchführt. Zum Beispiel versucht ein verwundeter Spieler, über einen großen Felsen zu kriechen, um ein Versteck vor Feinden zu finden. Der Server bestimmt , dass ein Spieler am Rande des Felsens bewegen kann (der Server hat keine Ahnung , dass es ist ein Rock, nur , dass es ein Weg der Spieler neben einen unpathable Bereich dauern können) , während der Kunde weiß , dass das Gestein vorhanden ist und spielt eine Animation des Charakters, der sich beim Gehen gegen den Felsen stützt. Beachten Sie, dass sich der Client nicht bewegtden Charakter oder das Spielgeschehen in diesem Fall in irgendeiner Weise beeinflussen; Es reagiert nur mit einer Animation auf die Objekte in der Nähe.

Sie können auf jeden Fall eine große Anzahl von Objekten auf dem Server speichern. Es ist nicht anders als jedes Open-World-Spiel. Verwenden Sie ein gutes räumliches Partitionsschema und halten Sie den Speicherbedarf Ihrer Objekte so gering wie möglich. Beachten Sie, dass wir hier möglicherweise unterschiedliche Versionen von "großen Zahlen" in unseren Köpfen haben: Wenn Sie damit gemeint haben, dass Sie jeden kleinen Kiesel oder Steinschlag im Spiel als separates Objekt speichern möchten, dann ist das auch für ein Einzelspielerspiel einfach albern . :)

Sean Middleditch
quelle
7

Ja - es ist machbar. MMOs teilen die Spielwelt häufig in mehrere Bereiche auf, da dies die Arbeit erleichtert. Sie können dies jedoch mit einem großen Bereich tun - Sie müssen lediglich ein gutes räumliches Partitionsschema verwenden.

Da sich die meisten Objekte in MMOs nicht bewegen, können Sie auch einen Vorverarbeitungsdurchlauf durchführen, bei dem Objekte zum Erstellen von Kollisionsprüfungsbäumen verwendet werden.

Der Speicherbedarf ist hier kein großes Problem, solange Sie Instanzen verwenden. Das Speichern von ein paar Floats pro Objekt ist nichts im großen Schema der Dinge. Ein bescheidener PC hat heutzutage 4 Gigabyte, während das Speichern einer Position nur 3 Floats (oder 3 Doubles) beträgt - was leicht mehrere Millionen gespeicherte Objekte im Spiel ermöglichen würde.

Das Speichern von Dingen wie Inventar für jeden Spieler würde zweifellos mehr Daten in Anspruch nehmen - obwohl dies leicht auf der Festplatte zwischengespeichert und nur geladen werden kann, wenn sich ein Spieler anmeldet.

Sie möchten die Kollisionsprüfung redundant sowohl auf dem Client als auch auf dem Server durchführen, da der Client so schneller auf die Umgebung reagieren kann. Wenn ein Spieler gegen eine Wand tritt, soll er sofort aufhören, sich zu bewegen - nicht nach einer halben Sekunde, wenn der Server antwortet.

Sie möchten den Server auch nur für autorisierende Zwecke verwenden. Zum Beispiel würden Sie die Pfadfindung nur auf dem Client durchführen, da Sie nicht schummeln können, indem Sie einen weniger effizienten Pfad einschlagen!

Grundlos
quelle
danke für den tipp über räumliche aufteilungsschemata, ich habe etwas neues gelernt
sajith