Netzwerk, welche methode?

Übersicht BlitzBasic Blitz3D

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

nils2771989

Betreff: Netzwerk, welche methode?

BeitragDi, Nov 20, 2007 23:30
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Nov 20, 2007 23:36
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Nov 20, 2007 23:41
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink
Und ich denke, das ist dein Problem. Der SPieler RUCKELT dann sicher nicht, aber alles wird etwas verzögert angezeigt Wink
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 Smile

Ich würde irgendwie denken, dass es am Code liegt .... Wink
vllt hast du ja D oder TCP verwendet... ganz schnell zum UDProtokoll wechseln >.<
Twitter
Download Jewel Snake!
Windows|Android

nils2771989

BeitragDi, Nov 20, 2007 23:58
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Nov 21, 2007 9:29
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

The_Nici

BeitragMi, Nov 21, 2007 15:01
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink
Und ich denke, das ist dein Problem. Der SPieler RUCKELT dann sicher nicht, aber alles wird etwas verzögert angezeigt Wink
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

BeitragMi, Nov 21, 2007 15:32
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Nov 21, 2007 15:34
Antworten mit Zitat
Benutzer-Profile anzeigen
@ 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

BeitragMi, Nov 21, 2007 15:48
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Nov 21, 2007 15:55
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Nov 21, 2007 16:08
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Razz
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

BeitragMi, Nov 21, 2007 16:09
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Nov 21, 2007 16:10
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Nov 21, 2007 16:16
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

ZaP

BeitragMi, Nov 21, 2007 16:34
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Nov 21, 2007 16:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Genau Smile
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

BeitragMi, Nov 21, 2007 17:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Ausgezeichnet. Danke!
Starfare: Worklog, Website (download)

The_Nici

BeitragMi, Nov 21, 2007 17:06
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Nov 21, 2007 17:18
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Nov 21, 2007 17:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Und beim Auslesen?
Muss ich dann das ganze wieder aufteilen?

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group