Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

11

01.03.2013, 20:32

Ein Rollenspiel ist kein Ego-Shooter. 50 Pakete pro Sekunde sind schlicht Irrsinn und zudem unnötig.
Zumindest bei den meisten.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

12

03.03.2013, 16:43

Thema Prediction ist hier auch nicht ganz unwichtig. Ich weiß nicht ob du dir darüber schon Gedanken gemacht hast, bzw überhaupt viel damit anfangen kannst. Guck da vielleicht mal ein wenig im Internet. Was auch ganz nützlich ist, ist zu gucken wie andere Engines mit dem ganzen umgehen. Hier gab es im Forum mal einen Thread in dem drei Links genannt wurden. Einer zur Source Engine, in einem gings glaube um Quake und in einem ging es um allgemeine Konzepte. Die drei Links haben mir bei einem Projekt mal sehr gut weitergeholfen. Ich finde sie grad nicht. Ich gucke gleich aber noch mal.

edit: in diesem Beitrag. Fred hat recht weit oben drei Links gepostet. Die fand ich alle drei ziemlich informativ. Aber es war Unreal und nicht Quake;) Naja hilft dir sicher weiter.
Mit dem Thema hatte ich mich bisher noch nicht befasst. Der Einfachheit halber würde ich die Prediction _erstmal_ vernachlässigen :P
Meine (persönlichen) Tipps zu dem Thema (gibt nat immer die Ausnahmefälle wo diese Tipps nicht greifen, aber die sind selten):
-(eigentlich) nie TCP und UDP mixen. UDP wird TCP in fast jedem Fall aus dem Konzept bringen und die UDP Verlustrate wird auch nicht unbedingt besser dadurch.
-wenn möglich Zustände statt Nachrichten verwenden. Weil mit 100% Wahrscheinlichkeit geht irgendwann doch irgendwas schief und der berühmt berüchtigte OoS betritt die Bühne. Für ein Nachrichtne basiertes System ist dass äquivalent zum Gameover. Für ein Zustand basiertes ist das höchstens ein "ups" oder fällt garnicht auf.
Warum sollte ein Mix aus TCP und UDP zu Problemen führen? Ich bin bisher davon ausgegangen, dass das häufig zusammen verwendet wird. Klar sollte ich aufpassen, dass ich die Verwendung beider Protokolle nicht so ineinander verzahne, dass der Verlust eines UDP-Paketes die TCP-Verbindung aus dem Konzept bringt. Aber ich würde auch das mit den Wegpunkten bevorzugen. Der Client hat dann nur noch die Aufgabe den Weg zwischendrinnen zu interpolieren.er wenn ich dann wirklich zyklische Updates (Objekt X steht an Pos Y) sende, würde ich UDP vorziehen - für andere Kommunikation (die ggf. sicherer ankommen soll) nehme ich dann TCP.

Zitat

Außerdem (hast du ja eh vor):
-server-client basiertes System & Server = Gott
Und warum sollte Gott keine Aktualisierungen über UDP verschicken? :D
Wenn du bei deinem Rollenspiel allerdings eine Pfeiltastensteuerung wie in Egoshootern drinnen hast, ist der Zielpunkt bzw. der Weg nicht vorhersehbar, daher würde ich z.B. jede 20 ms die aktuelle Transformation senden
und den Client halt zwischen den Daten interpolieren lassen. (Ich glaub das machen moderne Egoshooter auch so)
Ein Rollenspiel ist kein Ego-Shooter. 50 Pakete pro Sekunde sind schlicht Irrsinn und zudem unnötig.
Zumindest bei den meisten.
Sagen wir mal es gibt auf der Map 50 Objekte (Spieler, Gegner und rechnen wir mal Geschosse wie Pfeile und Feuerbälle mit ein, die sich bewegen). Wenn ich 50 Pakete (der Einfachheit halber ein Paket pro Objekt) sende, sind das 2.500 Pakete pro Sekunde. Nun könnte so ein Update-Paket z.B. 10 Byte groß sein (eine ID zur Identifizierung, eine Blickrichtung, eine ID für die aktuelle Animationsart - Idle, Move, Attack etc. - und noch eine Position in der Ebene). Dann sind wir bei ca. 24,4 KB. Nach einer gespielten Stunde wären das ca. 86 MB Daten, die durch Update-Pakete zustande kamen. Rein von der Menge der Daten her sollte das kein Problem sein. Allerdings habe ich keine Erfahrung damit, ob das zu Performance-Problemen führen könnte.

Ach ja: und dazu kommt noch das, was das Protkoll an Daten eh noch mitschleift. Die 86 MB sind also reine Nutzlast ohne Informationen wie Absender und Empfänger! Wenn ich das dann per TCP sende, bekomme ich (vermute ich) sehr schnell ein Problem (Stichwort Three-Way-Handshake :D )

LG Glocke

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Glocke« (03.03.2013, 16:56)


13

03.03.2013, 17:01

Warum sollte ein Mix aus TCP und UDP zu Problemen führen? Ich bin bisher davon ausgegangen, dass das häufig der Fall ist. Klar sollte ich aufpassen, dass ich die Verwendung beider Protokolle nicht so ineinander verzahne, dass der Verlust eines UDP-Paketes die TCP-Verbindung aus dem Konzept bringt. Aber wenn ich dann wirklich zyklische Updates (Objekt X steht an Pos Y) sende, würde ich UDP vorziehen - für andere Kommunikation (die ggf. sicherer ankommen soll) nehme ich dann TCP.
Characteristics of UDP Packet Loss: Effect of TCP Traffic [via UDP vs. TCP - gafferongames.com]
Was da über TCP/IP bei gafferongames.com geschrieben wird, sehe ich nicht so, aber dass sich die Protokollvarianten stören können, scheint wirklich ein Problem zu sein.

Alles was sich nicht bewegt, sollte möglichst nur einmal "Hallo" sagen und sich dann erst bei einem Zustandswechsel wieder über Netzwerk melden. Bei RPGs kannst Du auf viele Details verzichten. Bei Diabloartiger Steuerung würde ich für die Bewegung nur die Zielpunkte ggf. relativ zu einem Grid übertragen. Wenn Du wirklich willst wirst Du ziemlich viel Komprimieren können. Was nützt Dir die Animationsart, wenn Du nicht den Frame mitschickst (so macht das AFAIR Quake2).

14

03.03.2013, 17:12

Bei RPGs kannst Du auf viele Details verzichten. Bei Diabloartiger Steuerung würde ich für die Bewegung nur die Zielpunkte ggf. relativ zu einem Grid übertragen. Wenn Du wirklich willst wirst Du ziemlich viel Komprimieren können.
Das sehe ich 1:1 genauso


Zitat

Alles was sich nicht bewegt, sollte möglichst nur einmal "Hallo" sagen und sich dann erst bei einem Zustandswechsel wieder über Netzwerk melden.

Also z.B. Truhen :D ... das hat was von einem der asdf-Movies mit der Parkuhr "Hallo Parkuhr" - "Hallooooo" :crazy:
Würdest du dann bei beweglichen Objekten regelmäßige Updates versenden? Prinzipiell kann man eine neue Zielposition ja als Zustandswechsel ansehen. Dann passt es auch für bewegte Objekte in dein Schema :)

Zitat

Was nützt Dir die Animationsart, wenn Du nicht den Frame mitschickst (so macht das AFAIR Quake2).
Kp wie ich das zu verstehen habe :D Also meine bisherige Idee war, dass der Client weiß, welche Animationsart (z.B. Idle) das Objekt gerade durchlebt. Bekommt es dann ein Update "Animationsart ist jetzt Move", dann startet es die Bewegungsanimation (die Frames sollte es schon lokal aus einer oder mehreren Dateien laden). Irgendwann kommt dann noch ein Richtungswechsel und der Client malt für das Objekt wieder einen anderen Frame (dem es lokal auf der Platte gefunden hat^^)

Keine Ahnung ob das das ist was du meinst, oder etwas anderes :D

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

15

03.03.2013, 17:15

Bei einem RPG muss der Server überhaupt keine Animation schicken. Das kann der Client ganz allein machen anhand der Informationen wie:
- Objekt fängt an zu laufen
- Objekt hält an
- Objekt nutzt Skill XYZ
- Objekt nutzt Item XYZ
- ...
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

16

03.03.2013, 17:27

Bei einem RPG muss der Server überhaupt keine Animation schicken. Das kann der Client ganz allein machen anhand der Informationen wie:
- Objekt fängt an zu laufen
- Objekt hält an
- Objekt nutzt Skill XYZ
- Objekt nutzt Item XYZ
- ...
Genau so hatte ich das vor. Hab ich das anders geschrieben, oder bezieht sich das auf Chromanoid?


@Chromanoid: Was sollte man dann im Bezug auf die Verwendung von TCP und UDP machen? Nur TCP / nur UDP?

LG Glocke

17

03.03.2013, 17:52

Das mit dem Frame mitschicken halte ich für RPGs unsinnig, die Informationen an sich sind halt recht unnütz, wenn Du nicht auch den Frame der Animation mitschickst, das wollte ich nur erwähnen.
Ich würde mir jedes dynamische Objekt als eine Art Nachrichtenversender vorstellen. Die Nachrichten haben dabei eine Verfallszeit innerhalb der Sie auch noch nachträglich an ins Sichtfeld kommende Spieler versandt werden. Wenn Du noch Nachrichten einbaust, die nie verfallen, aber ihre Informationen ändern, kannst Du recht elegant ein System zur Zustandsübertragung einbauen. Die Zeitstempel müssen natürlich immer am Zeitstempel des Servers orientiert sein.

-SERVER-ZUSTAND:
aktuelleZeit: Zeitstempel

--ALLE NACHRICHTEN:

---NACHRICHTEN ZU SPIELER
spielerId: Id
----AUFTRITT:
spielerName: String
position: Position
richtung: Richtung
aussehenId: Id
----RELATIVE_BEWEGUNG
spielerId: Id
startZeit: Zeitstempel
relativerZielpunkt: Position
geschwindigkeit: Zahl

---NACHRICHTEN ZU SPIELER
spielerId: Id
----TEXTNACHRICHT
nachricht: String

---NACHRICHTEN ZU GEGNER
gegnerId: Id
----RELATIVE_BEWEGUNG
startZeit: Zeitstempel
relativerZielpunkt: Position
geschwindigkeit: Zahl
----AKTION
aktionsId: Id
startZeit: Zeitstempel

--ABGÄNGE
ids: Id[]

An Deiner Stelle würde ich erst mal nur mit TCP/IP arbeiten (das ist einfacher) oder vielleicht ein Framework einsetzen. Falls Du mit Java entwickelst wäre kryonet sicher was. Ansonsten kannst Du Dir mal Raknet anschauen.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Chromanoid« (03.03.2013, 18:01)


daG

Treue Seele

Beiträge: 130

Wohnort: Hamburg

  • Private Nachricht senden

18

03.03.2013, 17:59

Ohne mir jetzt alles durchgelesen zu haben wollte ich dennoch einen interessanten Link beitragen. Ich implementiere gerade selbst eine in JavaScript mit Node.js und Websockets welche schon recht gut funktioniert.

Man kann ohne Probleme an den Parametern drehen falls 66 Ticks für einem zu viel sind. Ich habe z.B. nur 10 Ticks, welche für mein Spiel vollkommen ausreichen.

https://developer.valvesoftware.com/wiki…ayer_Networking

19

03.03.2013, 18:02


An Deiner Stelle würde ich erst mal nur mit TCP/IP arbeiten (das ist einfacher) oder vielleicht ein Framework einsetzen. Falls Du mit Java entwickelst wäre kryonet sicher was. Ansonsten kannst Du Dir mal Raknet anschauen.
Ich arbeite mit C++ und habe mit SDL_net bisher sowohl mit TCP- als auch UDP-Sockets experimentiert. Derzeit arbeite ich an einem kleinen Framework, um Events (mit Primitivdaten) über TCP- oder UDP-Sockets zu versenden und an der Gegenseite in einer Warteschlange anzusammeln (dort warten die Events dann auf die Weiterbearbeitung).


Wie gesagt: bisher war ich davon ausgegangen TCP und UDP (für jeweils eigenständige Zwecke) parallel zu verwenden; UDP eben für Dinge die auch mal verloren gehen können und TCP für quasi alles andere. Wenn ich die Lösung mit den Wegpunkten (bei der Objektbewegung) verwende (statt der mit den Pfeiltasten und Bewegungsrichtungen), habe ich dann (aus derzeitiger Sicht) gar keine Daten mehr, die ich per UDP schicken würde. Also im Endeffekt würde ich dann mit TCP auskommen.


Einige Aussagen auf http://gafferongames.com wie "Using TCP is the worst possible mistake you can make when developing a networked game!" lassen TCP irgendwie als Teufelszeug dastehen. :dash: Dort wurde ja empfohlen UDP zu verwenden und die TCP-Features, die man benötigt - mit UDP zu implementieren. Das wäre dann aber das Rad zu 90% neu zu erfinden :pillepalle:
Ich weiß nicht so recht, was ich davon halten soll :hmm:


Wahrscheinlich muss ich das Spiel erst einmal mit meinem kleinen Framework implementieren ("Writing Games, not Engines" :D ) um herauszufinden, ob ich mit TCP überhaupt an die rechentechnischen Grenzen stoße. Passiert das kann ich mir dann ja noch einmal Gedanken machen, wie ich vorgehe. Stoße ich auf keine Probleme, wäre die Welt in Ordnung 8) Oder wie seht ihr das? :search:

LG Glocke

20

03.03.2013, 18:12

Ja, wie gesagt ich sehe den Artikel in dieser Hinsicht kritisch. Gerade bei RPGs und Event-basierten Systemen muss man meist doch alles verlässlich übertragen. Ich glaube es wird sich in dem Artikel vor allem auf Action-Games bezogen. Es gibt viele Multiplayer-Spiele, die teils gezwungenermaßen TCP/IP benutzen und gut funktionieren, WoW nutzt AFAIK auch nur TCP. Ich würde an Deiner Stelle versuchen eine Bibliothek für die Kommunikation zu finden. Oft kann man die dann auch auf UDP umstellen. Außerdem solltest Du Dir überlegen sowas wie protobuf von Google zu nutzen, das wurde bei Diablo 3 auch eingesetzt, sowas erhöht Deine Produktivität sicher. Schau mal hier, da spricht ein erfahrener Spieleentwickler über Netzwerkbibliotheken: http://www.codeofhonor.com/blog/choosing-a-game-network-lib

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Chromanoid« (03.03.2013, 18:18)


Werbeanzeige