Ich bin ein Hobby-Programmierer und im Moment bin ich gespannt, welche Daten in einer Multiplayer-Sitzung in Echtzeitspielen wie Starcraft 2 ausgetauscht werden. Ich habe eine Reihe von Suchvorgängen durchgeführt. Ich fand, dass gafferongames.com einen sehr guten Überblick über die zu berücksichtigenden Probleme bietet.
Glenn gibt in seinem Artikel und seinen Kommentaren ein sehr starkes Argument für die Verwendung von UDP über TCP an, aber SC2 verwendet offensichtlich TCP. Um Gleen zu qouten,
Das Problem bei der Verwendung von TCP für Spiele besteht darin, dass Multiplayer-Spiele im Gegensatz zu Webbrowsern, E-Mails oder den meisten anderen Anwendungen eine Echtzeitanforderung für die Paketzustellung haben. Für viele Teile Ihres Spiels, zum Beispiel Spielereingaben und Charakterpositionen, spielt es keine Rolle, was vor einer Sekunde passiert ist, Sie kümmern sich nur um die neuesten Daten.
Aus seiner Aussage gehe ich davon aus, dass sein Ansatz darin besteht , den vollständigen Spielstatus jeder Einheit auf jedem Frame zu senden . Wenn der Server im aktuellen Frame keine Spielereingabe empfängt, hat dieser Spieler nur wieder Glück. Für God of War: Acension, in dem er als leitender Netzwerkentwickler tätig ist, sollte dies meiner Meinung nach recht gut funktionieren.
Für SC2 sagt mir mein Bauchgefühl aufgrund seiner Wiedergabefähigkeit, dass die zugrunde liegende Engine eine deterministische feste Zeitschritt-Wiedergabemaschine für Benutzereingaben ist, bei der nur Dateneingaben ausgetauscht werden . Daher ist Glenns Aussage für SC2 völlig irrelevant. Die Eingabe durch den Spieler ist wichtig, und die Eingabesequenz ist noch wichtiger. Ich denke nicht, dass es für SC2 machbar ist, einen Spielstatus von 200 Einheiten und mehr mit 30 - 60 FPS zu senden.
Frage: Ich könnte mich irren, habe aber versucht, zwei mögliche Datentypen zu identifizieren. Was sind andere Techniken? Es wird gut sein, das Spiel zu beenden, wenn Sie so wollen.
BEARBEITEN: Ich habe diesen Link zum Starcraft-Netzwerkmodell gefunden
quelle
Antworten:
Glenn spricht hauptsächlich über physikgetriebene Spiele, dh. Ego-Shooter und Fahrspiele. Diese haben andere Anforderungen als Echtzeit-Strategiespiele, bei denen genaue Einheitenpositionen bei jedem logischen Schritt wichtig sind. Die Kommunikationsstrategien sind also notwendigerweise unterschiedlich.
"Echtzeit" bedeutet verschiedene Dinge in verschiedenen Kontexten. Spiele sind in Echtzeit nicht "schwer". Wenn eine Nachricht zu spät kommt, bricht das Ganze zusammen. (Zumindest gibt es keinen guten Grund dafür, dass ein Spiel so anspruchsvoll ist, da ein reines Softwaresystem im Gegensatz zu einem Kernkraftwerk oder einem medizinischen Gerät in der Lage sein sollte, sich von Verarbeitungsverzögerungen zu erholen.) Spiele sind wirklich "weich" oder "fest" in Echtzeit. ( Definitionen bei Wikipedia wie gewohnt .) Die Art des Spiels macht einen Unterschied, wie schnell Sie die Informationen benötigen, ob Sie Informationen verlieren und damit durchkommen können usw. Es genügt zu sagen, dass TCP für viele Spiele gut genug ist, aber Für andere Spiele ist UDP vorzuziehen.
Er würde genügend Informationen senden, um den relevanten Spielstatus jeder Einheit zu rekonstruieren, die sich geändert hat.
Die meisten Spiele erfüllen nicht die Kriterien für 3, daher verwenden sie stattdessen 1 und 2. Viele RTS-Spiele können und können jedoch 3 verwenden.
Außerdem muss es nicht unbedingt "jeder Frame" sein. Das Konzept eines Rahmens ist ebenfalls nebulös. Ist es ein Rahmen für das Rendern? Ist es eine Menge Logik? Ist es ein Rahmen von Netzwerkdaten, die gesendet werden? Stimmen die drei immer eins zu eins überein oder erhalten Sie eine variable Grafikrate mit festen Logikraten? Einige Spiele, insbesondere Echtzeit-Strategiespiele wie Starcraft 2 oder Spiele mit Wiederholungsfähigkeit (wie Sie sie berühren), möchten alles durch regelmäßige Netzwerkaktualisierungen (die in anderer Hinsicht mit "Frames" übereinstimmen oder nicht) in perfektem Gleichschritt halten Dies ist nicht für alle Spiele erforderlich. Viele Spiele senden nur regelmäßig Updates, je nachdem, wie weit sie bereit sind, die Clients laufen zu lassen.
Viele Spiele behandeln einen Rendering-Frame nicht unbedingt als logischen Frame. Sie haben möglicherweise 60 FPS in Grafiken, aber nur 10 Logikaktualisierungen pro Sekunde und senden jeweils 1 Netzwerkaktualisierung. Aber selbst 30 Netzwerkaktualisierungen pro Sekunde sind sinnvoll, wenn Sie die Methode "Eingabe senden" verwenden.
Es gibt nicht so sehr unterschiedliche Techniken, sondern verschiedene Einschränkungen für die Systeme, und die Bedeutung jeder Einschränkung variiert von Spiel zu Spiel. Sie müssen also nur ein System auswählen, das für Sie funktioniert.
quelle
Die Haupttechnik, die Sie kennen müssen, ist die "1500 Bogenschützen" -Technik. Es wurde berühmt von Age of Empires verwendet, wird aber auch in anderen Spielen wie dem (Open Source) OpenTTD (basierend auf Transport Tycoon Deluxe) verwendet.
Um es klar auszudrücken: Mit dieser Technik müssen Sie während des Spiels KEINEN Spielstatus senden. Der gesamte Spielstatus wird beim ersten Start gesendet, verbunden und erneut synchronisiert. Die einzigen Dinge, die Sie regelmäßig senden müssen, sind Zeitsignale und Synchronisierungsprüfungen. Normalerweise werden nur Player-Befehle vom Client an den Server gesendet und umgekehrt. Wenn ein Spieler keine Befehle ausführt (wie es bei den meisten Ticks der Fall ist), müssen keine Daten gesendet werden.
Siehe diesen Link.
http://www.gamasutra.com/view/feature/3094/1500_archers_on_a_288_network_.php
Update: Kylotan nennt diese "Technik 3" in der Antwort.
quelle