Werden in modernen Multiplayer-Spielen riesige, statische Objekte wie die Umgebung vom Server zum Client übertragen?


18

Ich habe ein autoritäres System, bei dem der Spieler, wenn er sich dem Match anschließt, alle bereits gespawnten Objekte erhält - die auf sich selbst (dem Kunden) gespawnt sind.

Es sieht aus wie das:

  1. Client Sendet das Zugriffstoken an die Server
  2. Client erhält die Annahme von der Server
  3. Client Schaltet die Szene zur Spielszene um
  4. ServerSendet Spieler, Kisten und Objekte, mit denen Sie interagieren clientkönnen, damit sie erscheinen und angezeigt werden können.

Aber was ist mit dem Grundobjekt? Im Moment habe ich genau die gleiche Szene auf dem Server und dem Client - mit einer statischen Ebene, die als Etage fungiert. Momentan füge ich neue Dinge hinzu, Bäume, Treppen und baue Dinge zusammen.

Ich dachte - wir sind gut. Aber sollte die Umgebung nicht auch synchronisiert werden? Irgendwie vernetzt sein? Im Besitz des Servers?

Nehmen wir League of Legends:

Bildbeschreibung hier eingeben

Es ist eine statische Umgebung, wahrscheinlich ein kombiniertes Geflecht (Treppen, Gras, Wände, Laden). Aber bleibt es wirklich auf dem Client oder wird es vom Server während des Ladevorgangs gesendet?


1
Sie können sogar darüber nachdenken, wie Sie Liga-Charakteren und -Umgebungen benutzerdefinierte Skins hinzufügen können. Wenn Sie sie nicht an sever senden, werden sie lokal angezeigt. Daher ist es sinnvoll, den Schluss zu ziehen, dass sie lokal gespeichert und gerendert werden. Außerdem haben sie keinen Einfluss auf das Gameplay. Wenn Sie nach Kollisionen fragen, handelt es sich um eine Mischung aus Server und Client, sodass der Spieler nicht betrügen und durch Wände gehen kann.
Candid Moon_Max_

Antworten:


41

Nein, Kunstobjekte jeglicher Art werden nicht routinemäßig über das Netzwerk gesendet. Im Allgemeinen verfügen alle Clients lokal über dieselben Inhaltsressourcen. Möglicherweise gibt es Code, um sicherzustellen, dass dies der Fall ist, indem der Inhalt mit einer Prüfsumme oder ähnlichem versehen wird. Wenn Sie Bedenken haben, dass Benutzer einen Teil ihrer Inhalte clientseitig manipulieren könnten, können Sie ein ähnliches System implementieren.

Der Server sendet möglicherweise Anweisungen an den Client, die angeben, dass bestimmte Assets angezeigt oder ausgeblendet werden sollen, sendet jedoch nicht die tatsächlichen Daten des Assets. Dies ist in der Praxis zu verschwenderisch und zu langsam und kann bei Menschen mit begrenzten verfügbaren Daten zu echten Problemen führen.

In bestimmten Fällen können kleinere Assets in ihrer Gesamtheit gestreamt werden, wenn das Asset irgendwie als "Spoiler" betrachtet wird oder was auch immer. Aber das ist ungewöhnlich. Im Allgemeinen sehen Sie, dass ein Spiel möglicherweise neuen Inhalt von einem Patch oder was auch immer herunterlädt , dies geschieht jedoch nur einmal während des Patch-Vorgangs beim Start. Nicht während des Spiels.


21
Beachten Sie, dass diese Antwort nur statische Assets anspricht. Dynamische / von Spielern erzeugte Assets (z. B. Minecraft-World-Chunks oder MMORPG-Gildenlogos, die von Spielern hochgeladen werden können) müssen übertragen werden. Aber selbst dann versucht man normalerweise, die erforderliche Datenmenge zu minimieren (um das Minecraft-Beispiel fortzusetzen: Senden von Blockaktualisierungen anstelle ganzer Blöcke, wobei nur der Blocktyp / -status und die geänderte Koordinate angegeben werden) und / oder die Daten auf der Clientseite zwischenzuspeichern .
Hoffmale

@hoffmale Ja, guter Punkt; Die Frage erwähnte, dass die Landschaft am Ende statisch war, also dachte ich nicht darüber nach, aber es ist eine gute.

3
Wenn es sich bei einem Asset um einen Spoiler handelt, befindet sich das Asset normalerweise verschlüsselt auf dem Client, und der Entschlüsselungsschlüssel wird vom Server an den Client übertragen, wenn das Asset benötigt wird.
Grant Davis

4
Wenn Sie beispielsweise Bäume zufällig auf einer Karte platzieren müssen, anstatt die Koordinaten der Bäume an den Client zu senden, wird der Startwert (des Zufallszahlengenerators) an den Client gesendet.
Grant Davis

5

Hängt von mehreren Faktoren ab, einschließlich der Art des Spiels (ich gehe davon aus, dass RTS hier ist, obwohl auch Open World MMO in den Sinn kommt). Ein lokaler Basis-Terrain-Status wird entweder bei der Verbindung gesendet oder ist Teil des Client-Assets. Stellen Sie sich ein RTS-Spiel vor, bei dem die Karte entweder mit dem Client ausgeliefert oder vor Spielbeginn heruntergeladen wird.

In der Tat würde das Mesh normalerweise nicht gesendet, da es sich in den meisten RTS-Fällen bereits auf dem Client befindet. Eine andere Frage ist, ob die Kollisionskarte gesendet wird, die für die Synchronisierung der beiden Karten von entscheidender Bedeutung ist. In den meisten RTS wird dies jedoch wieder auf dem Client gespeichert.

Es hängt also wirklich davon ab, womit Ihr RTS ausgeliefert wird, ob Sie die Karten vor dem Spielen herunterladen oder zu dem Zeitpunkt, zu dem das Spiel beginnt.

Danach gibt es einige typische Möglichkeiten, um synchron zu bleiben:

  • Deltas werden an den Client gesendet - die gebräuchlichste und effizienteste Methode, um die lokale / Client-Welt mit dem Server auf dem neuesten Stand zu halten.
  • Gelegentlich werden Prüfsummen entweder von Server zu Client oder von Client zu Server gesendet, um sicherzustellen, dass der Weltzustand tatsächlich übereinstimmt.
  • Gelegentlich wird der vollständige Status erneut gesendet, um den Client erneut zu synchronisieren - häufig aufgrund technischer Probleme wie Gleitkommadrift.

4

Was Ihre genaue Frage betrifft, so weiß ich nicht, wie League of Legends speziell damit umgeht. Ich habe dieses Spiel noch nie gespielt, daher kann ich nicht vorschlagen, ob es nötig ist oder nicht.

Die Antwort auf Ihre Frage ist im Allgemeinen recht einfach und unkompliziert:

Wenn die Daten statisch sind und Sie sicher sind, dass sie sich nie ändern werden (abgesehen von regelmäßigen Updates für das gesamte Spiel, die jedoch separat sind), warum sollten Sie dann jemals diese zusätzlichen Daten senden? Normalerweise versuchen Sie zu vermeiden, dass etwas gesendet wird, was vermieden werden kann. Senden Sie Daten nur, wenn diese Kommunikation erforderlich ist .

Auf der anderen Seite, wenn die Daten der Zeit ändern werden , oder wenn Sie nur auf diese Option offen lassen wollen, dann haben Sie wirklich keine Wahl in der Angelegenheit? Für diesen Fall Sie müssen die Daten senden. Ansonsten hat der Kunde nicht das, was er braucht.

Dies gilt für die gesamte Netzwerkkommunikation, nicht nur für Geländedaten. Alles .


2

Nein.

Ich habe einiges darüber getan, wie man in der Quelle von League of Legends herumgräbt, und alles, einschließlich Championmodelle, Ladenbesitzer, allgemeinem Kartenhintergrund und nachträglich hinzugefügten Flaumkreaturen (wie das kleine Eichhörnchen auf einigen Steinen und eine Schnecke in der Fluss) werden auf der Client-Seite gehalten. Die Tatsache, dass der Client alle diese Modelle hat, ist einer der Gründe, warum LoL viele Gigabyte groß ist.

Das Übertragen all dieser Daten vom Server zum Client wäre höllisch, ganz zu schweigen von der Bandbreitennutzung, um im nächsten Spiel alles noch einmal zu machen.

Wie wird es dann gelöst? Jeder Spieler sendet NUR die Daten, die für andere Spieler im Spiel von Bedeutung sind, an den Server. Niemand muss wissen, ob noch 5 Sekunden für die Abklingzeit von Q zur Verfügung stehen oder ob die Deep Terror Thresh Skin Blasen für Sie erzeugt. Dinge, die im Spiel weitergegeben werden, sind Dinge wie: Vel'Koz hat Q gewirkt, Viktor ist nach links gegangen, etc ...

In Bezug auf den Ladebildschirm, den Sie angesprochen haben, gibt es Dinge, über die jeder Spieler mit den Servern von Riot sprechen muss, bevor das Spiel beginnt, Handshakes für sichere Verbindungen und Anti-Cheating-Protokolle.

HINWEIS:

Wenn Sie sich umschauen möchten, über welche Inhalte der Client verfügt und der Server Sie daher nicht weiterleitet, suchen Sie den Ordner C: \ Riot Games \ RADS \ lol_Game_Client \ Projects. Ich arbeite gerade am Speicher und finde einen .RAF-Datei-Entpacker online. Dann können Sie alles sehen, was sich vor Ort befindet, wie z. B. das Laden von Bildschirmspritzern und Hautstrukturen, sogar von Champion-Skeletten.


1
Die naheliegende Möglichkeit, dies zu implementieren, besteht darin, dass der Client (von einem dedizierten Asset-Server) alle Assets anfordert, die er noch nicht lokal gespeichert hat. Wenn er sie empfängt, fügt er sie (halb) dauerhaft zu seinen hinzu lokaler persistenter Speicher auf der Festplatte. Auf diese Weise werden Assets nur einmal und nur dann heruntergeladen, wenn sie tatsächlich benötigt werden. (Sobald das funktioniert, wäre eine Optimierung sein, die Kunden lokalen Speicher mit einem Vermögen vorab zu füllen, die sehr wahrscheinlich benötigt werden Dies würde die Startzeit auf den ersten Verbindungs, auf Kosten der Herstellung des Spiels Installationspaket größer das Spiel reduzieren.)
Jeremy Friesner

1
@JeremyFriesner Warum sollte das der naheliegende Weg sein? Das hört sich schlimmer an als die in diesem Beitrag beschriebene aktuelle Implementierung, bei der Sie alle Assets im Voraus installieren, damit Sie sie sofort zur Verfügung haben, wenn Sie sie benötigen. Es könnte für ein Einzelspieler-Spiel in Ordnung sein, obwohl ich denke, dass viele Leute eine längere Installationszeit (und mehr Speicherplatzverbrauch) vorziehen würden, als ständig darauf warten zu müssen, dass neue Assets während des Spiels heruntergeladen werden.
Anthony Grist

2
Für ein Multiplayer-Spiel? Absolute Katastrophe. Sie möchten nicht jeden anderen Spieler warten lassen, um das Spiel zu starten, da eine Person einige Assets herunterladen muss, die sie bisher noch nicht benötigt haben.
Anthony Grist

1
@AnthonyGrist Aus diesem Grund müssen bei vielen Spielen wie League of Legends alle Spiele-Assets heruntergeladen werden, bevor sie in die Warteschlange gestellt werden können, um ein Spiel zu finden. Dies funktioniert viel besser als eine Verzögerung des Spiels, während Sie darauf warten, dass ein großes Gut funktioniert. Denken Sie daran, dass in dieser Spielgattung die Spieler über eine Reduzierung des Ping um 10 ms aufgeregt sind und häufig mit einem Ping von weniger als 50 ms spielen und feststellen können, ob dies in den Bereich von 100 bis 150 springt. Das Abrufen eines Vermögenswerts während eines Spiels wäre eine Katastrophe in einem MOBA oder FPS, und wenn es zur falschen Zeit passiert, könnte es sogar das Ergebnis eines Spiels verändern.
JustWannaFly

@AnthonyGrist (Fortsetzung) Ich denke, Sie könnten so darüber nachdenken. In einigen Multiplayer- / Wettbewerbsspielen tauschen die Spieler eine längere Lade- / Patch- / Installationszeit für ein Echtzeit-Spielerlebnis aus, indem ein Client sich um alle Aktualisierungen und das Eingeben von Warteschlangen kümmert. Dies macht es so, dass nur der Spieler warten muss, der Vermögenswerte benötigt, es sei denn, er möchte einer vorgefertigten Party beitreten. Dann müssten alle Spieler in der Party warten, um die Warteschlange zu betreten, um Gegner zu finden
JustWannaFly,

1

Ein Beispiel dafür, wo dies nicht getan wurde, war Elder Scrolls Online, wo dem Kunden die Höhe des Bodenniveaus anvertraut wurde .

Goldgräber fielen mehrere Fuß in die Tiefe. Sie konnten dann "unter" dem Gelände herumlaufen und Ressourcen von unten abbauen, ohne von PCs gesehen oder von NPCs angegriffen zu werden.

Ähnliche Bearbeitungen ermöglichten es ihnen, Klippen zu glätten, damit sie sie hinaufgehen, sie entfernen oder unter statischen Wänden hindurchführen, alle statischen Objekte durchsehen usw.

Im Wesentlichen vertraute der Server dem Client in Bezug auf den Standort des Spielers, und die Berechnung der Kollision auf der Serverseite für jeden einzelnen Spieler gegen alle statischen Werte wäre ziemlich schwierig.

In Tile-basierten Spielen wie Furcadia ist dies jedoch anders: Jedes Feld, in das Sie sich bewegen, ist serverseitig begehbar, und der Server muss dem Client in keiner Hinsicht vertrauen: Der Server kennt und validiert jede Bewegung und Benutzeraktion und Der Client zeigt die Aktion nur an, wenn der Server das Ergebnis mitteilt.


1
TL; DR: Gehen Sie immer davon aus, dass der Kunde ein Lügner, Betrüger oder Trappe ist . Die Serverüberprüfung von allem senkt jedoch Ihre Kapazität.
Draco18s
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.