Netzwerk, welche methode?
Übersicht

![]() |
nils2771989Betreff: Netzwerk, welche methode? |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hey wie gesagt geht es um eine frage für ein netzwerkspiel:
Wir wollten ein Rennspiel programmieren in dem man über das internet miteindander spielt, wir sind jedoch auf das problem gestoßen, wie man das am besten mit den Updates des Gegenspielers macht. Wir hatten die Idee, dass man vlt einfach nur die position und rotation des gegenspieler in jedem Frame übermittelt bekommt, aber da müssen viele daten als float übermittelt werden, was dazu geführt hat, dass der gegenspieler geruckelt/gezittert hat, da wohl die daten nicht 1zu1 übertragen werden Die zweite Idee war, dass einfach nur übermittelt wird, welche tasten gedrückt werden, und um ungenaugkeiten auszugleichen soll alle 50frames oder so die position und angeglichen werden, die hat aber dazu geführt, dass man immer springt, wenn die internetleitung nicht so schnell ist, diese methode ist also wohl zu ungenau... welche methode kann man am besten verwenden um sowas ruckelfrei zu realisieren? |
||
Schummle nicht, aber spiele nach eigenen Regeln.
Sei nicht verrückt, sondern einfach nur wahnsinnig. Sei nicht böse, führ nur nichts Gutes im Schilde. Verändere dich nicht, bleib immer anders. |
- Zuletzt bearbeitet von nils2771989 am Di, Nov 20, 2007 23:36, insgesamt einmal bearbeitet
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Denke nicht dass der gegenspieler darum geruckelt hat sondern wegen dem verwendeten protokoll.
Wenns in echtzeit sein soll MUSS es UDP sein. Kein DirectPlay oder TCP, die funktionieren da net. Interpolation musst du jedoch auch dann einbauen, denn 10-60ms dauert es bis die daten da sind (also 1-4 Frames auf 60FPS) |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
Tankbuster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Zitat: [...]aber da müssen viele daten als float übermittelt werden, was dazu geführt hat, dass der gegenspieler geruckelt hat.
Ich hoffe, du hast alles in einem Paket verschickt. Also Code: [AUSKLAPPEN] Writefloat stream,X-pos
Writefloat stream,Y-pos Writefloat stream,Z-pos SendUDPMsg bla bla blub Wenn der Gegenspieler natürlich zu viele Daten empfängt, werden sich die Pakete im Stream STAUEN ![]() Und ich denke, das ist dein Problem. Der SPieler RUCKELT dann sicher nicht, aber alles wird etwas verzögert angezeigt ![]() Ruckeln würde der Spieler nur, wenn z.B. jede 2 Sekunden ein Paket ankommt. Ansonsten: gesendet wird natürlich nur, wenn sich der Spieler bewegt. Der Server sollte so schnell laufen, dass er alle Pakete schnell auslesen kann (also net 1FPS) Also bei meinem ehemaligen xD-Online hat alles super geklappt. Konnten zu 4t spielen, und lief alles flüssig ![]() Ich würde irgendwie denken, dass es am Code liegt .... ![]() vllt hast du ja D oder TCP verwendet... ganz schnell zum UDProtokoll wechseln >.< |
||
Twitter
Download Jewel Snake! Windows|Android |
![]() |
nils2771989 |
![]() Antworten mit Zitat ![]() |
---|---|---|
danke für die Antworten
also ich befürchte, dass die lib, die wir benutzen directplay-basierend ist (k-net lib) bin mir da aber nicht ganz so sicher, was das senden der daten angeht: die werden alle in einer datei versendet... das problem aber ist, dass wir dies nich mit einem server machen, sonder einer der spieler gleichzeitig der host des spieles ist. |
||
Schummle nicht, aber spiele nach eigenen Regeln.
Sei nicht verrückt, sondern einfach nur wahnsinnig. Sei nicht böse, führ nur nichts Gutes im Schilde. Verändere dich nicht, bleib immer anders. |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Host des Spiels = Server
KNetLib sollte eigentlich UDP basierend sein oder zumindest Asyncron TCP (Blitz TCP geht nicht weils das Program blockt) Allerdings verstehe ich nicht was du mit datei meinst. Wenn du die daten effektiv in ne file schreibst und die verschickst, dann ist das der grund fürs lag, denn die HD ist einige welten zu langsam dafür. Einfach nur messages nehmen in der KNetLib und die versenden, dann sollte das auch ohne probleme gehen. Verschiedene Packettypen (posupdate, rotupdate etc) und alles müsste flüssig laufen ![]() |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
The_Nici |
![]() Antworten mit Zitat ![]() |
---|---|---|
Tankbuster hat Folgendes geschrieben: Zitat:
[...]aber da müssen viele daten als float übermittelt werden, was dazu geführt hat, dass der gegenspieler geruckelt hat.
Ich hoffe, du hast alles in einem Paket verschickt. Also Code: [AUSKLAPPEN] Writefloat stream,X-pos
Writefloat stream,Y-pos Writefloat stream,Z-pos SendUDPMsg bla bla blub Wenn der Gegenspieler natürlich zu viele Daten empfängt, werden sich die Pakete im Stream STAUEN ![]() Und ich denke, das ist dein Problem. Der SPieler RUCKELT dann sicher nicht, aber alles wird etwas verzögert angezeigt ![]() Ruckeln würde der Spieler nur, wenn z.B. jede 2 Sekunden ein Paket ankommt. Oha. Ich habs bis jetzt nie so gemacht. Muss ich dann ein spezielles verfahren mit dem auslesen machen, wenn ichs so mache? xD |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Erm wie hast du es denn gemacht?
Das ist die grundlage wie man es macht. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
nils2771989 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@ Dreamora
Jup mit host des Spiels=Server...war dumm ausgedrückt^^ also ich mein jetzt nicht als datei meine ich jetzt den ausgegenden datenstrom... naja falls es hilft, hier sind die codeausschnitte, wie die dateien gesendet und empfangen werden... zum senden: Code: [AUSKLAPPEN] KNL_SendInteger(1) KNL_SendInteger(KeyDown(key_w)) KNL_SendInteger(KeyDown(key_a)) KNL_SendInteger(KeyDown(key_s)) KNL_SendInteger(KeyDown(key_d)) If position_update<50 KNL_SendInteger(1) Else KNL_SendInteger(2) KNL_SendFloat(EntityX(player)) KNL_SendFloat(EntityY(player)) KNL_SendFloat(EntityZ(player)) KNL_SendFloat(EntityPitch(player)) KNL_SendFloat(EntityYaw(player)) KNL_SendFloat(EntityRoll(player)) KNL_SendFloat(speed#) position_update=1 EndIf KNL_UpdateNetwork(0, 0, 500, 48) position_update=position_update+1 und zum empfangen: Code: [AUSKLAPPEN] Select KNL_GetInteger(0) Case 1 net_player_w=KNL_GetInteger(1) net_player_a=KNL_GetInteger(2) net_player_s=KNL_GetInteger(3) net_player_d=KNL_GetInteger(4) Select KNL_GetInteger(5) Case 2 net_player_x#=KNL_GetFloat(6) net_player_y#=KNL_GetFloat(7) net_player_z#=KNL_GetFloat(8) net_player_xr#=KNL_GetFloat(9) net_player_yr#=KNL_GetFloat(10) net_player_zr#=KNL_GetFloat(11) net_player_speed#=KNL_GetFloat(12) net_enm_update=2 End Select End Select also alle 50 frames wird noch zusätzlich die position etc. übermittelt, sonst eben nur welche teste gedrückt wird, und dann berechnet jeder pc selber, wie sich das schiff bewegt...nur leider weiß ich nicht, was da jetzt nicht geht... als bei mir ruckelt das schiff des anderen spielers nur so gut wie gar nicht, bei dem anderen aber springt mein schiff richtig stark rum... |
||
Schummle nicht, aber spiele nach eigenen Regeln.
Sei nicht verrückt, sondern einfach nur wahnsinnig. Sei nicht böse, führ nur nichts Gutes im Schilde. Verändere dich nicht, bleib immer anders. |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
1. Nicht FPS abhängig machen! Du musst es zeitdifferenz abhängig machen weil sonst langsame garnie daten bekommen und solche Systeme wie main heimsystem einen Netzwerkkollaps erleiden (da ich > 1000 FPS ende)
2. Was heisst für dich Ruckeln? FPS gehen runter (-> ruckeln) oder springt immer wieder die Figur. In letzterem wäre es deine Interpolation die so noch nicht ausreichend ist. Einfach nur "nachmachen" reicht nicht, da muss auch ein wenig der faktor rein was geschieht, damit die Fehler nicht zu gross sind zwischen den "Updates" Ansonsten sollten die Datenmengen eigentlich ok sein ... Allerdings bringt uns der Code da ja nicht viel. Das ist ja der Client Code, könnten wir auch noch den Server Code dann haben, denn ich vermute, da machst du den fehler. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
ZaP |
![]() Antworten mit Zitat ![]() |
---|---|---|
Frage zum Thema:
Die meisten Spiele sind ja ebenfalls online Spielbar, für UDP Verbindungen muss man aber soweit ich weiß einen Port offen haben, bei heutigen Online Spielen kann man jedoch einfach drauflos zocken, nutzen die wirklich UDP? |
||
Starfare: Worklog, Website (download) |
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
Auch bei heutigen Spielen muss man die Ports forwarden.
Für Hellgate Lndon war das bei mir zum Beispiel der Port 4306. Und dass man einen Port öffnen muss liegt meistens auch daran, dass es keinen Onlineserver gibt, mit dem man sich einfach so Verbinden kann, sondern einer der Spieler muss den Server stellen, was heisst, dass die Ports, die für Anfragen benutzt werden, beim Router freigeschaltet werden müssen, da sie sonst von diesem geblockt werden. Falls ich wieder mal Halbwissen rausgelassen habe, weist mich bitte zurecht ![]() |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Du musst keinen Port offen haben als Spieler, nur als Host
Wenn du erst den Server anfragst, werden ankommende UDP nachrichten vom Server auf dem Port automatisch durchgeleitet. Der Host hingegen muss einen Port offen haben sonst wirds net gehen. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das ich bei mir den Port als Client freischalten musste, liegt daran, dass ich eine Hardwarefirewall benutze.
D.h. dass man das gewöhnlich nicht zu tun braucht. |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Und wie du das tun musst.
Solange du nicht auf 56k / ISDN bist hast du mit Tendenz einen Router und da musst du Forwarding einrichten, sonst weiss er garnicht wo er das zeug hinleiten soll ![]() |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
ZaP |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also frag ich bei dem Server am Port 29070 an, der Antwortet mir am selbigen, und der Router lässt das durch, weils eine Antwort ist? | ||
Starfare: Worklog, Website (download) |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Genau ![]() Ausser dein Router ist auf paranoid eingestellt (heisst er blockt alles ausser Port 80), dann geht eh nix rein. Aber das ist im Default nicht der fall, da wird rein gelassen was raus geht und nur von dort wo es hin ging. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
ZaP |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ausgezeichnet. Danke! | ||
Starfare: Worklog, Website (download) |
![]() |
The_Nici |
![]() Antworten mit Zitat ![]() |
---|---|---|
Dreamora hat Folgendes geschrieben: Erm wie hast du es denn gemacht?
Das ist die grundlage wie man es macht. "schreiben x" "senden" "schreiben y" "senden" Ich mach mal wieder was falsch. :X |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Das ist overkill.
Du musst effektiv Datenpackete schreiben wie es oben zb drin ist mit der knetlib. Sonst versendest du massiv viele "luftdaten" Auch kannst du nicht jedes Frame schicken, denn mit mehr als 60 FPS wirds unrealistisch schnell und das ohne sinnvolle Daten zu verschicken. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
The_Nici |
![]() Antworten mit Zitat ![]() |
---|---|---|
Und beim Auslesen?
Muss ich dann das ganze wieder aufteilen? |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group