Problem mit Netzwerksynchro
-
Ich finde keinen Ansatz wo der Server/Client diese komische Zeit verstreichen lassen könnte bis was passiert hier mal der Ablauf:
1. Spieler feuert (Mausklick->direkt zu Punkt 2)
2. Client schickt "Schuss" an den Server (Datenpacket geht direkt mit ->send() raus)
2.a Server fügt den Schuss in eine Liste ein
3.a Client beendet Hauptschleife (recv() wird ja nur einmal abgefragt)
3.b Server beendet Hauptschleife (wie Client)
4. Server sammelt alle Geschosse in einem Packet (einfacher String/Speicherbereich)
5. Server schickt Packet an Client
5.a Server beendet Hauptschleife
6. Client empfängt alle Schüsse und stellt diese darIch habe die Zeit von Punkt 1 bis Punkt 6 gemessen und die schwankt wie gesagt um die 500ms.
Jetzt hab ich auf einmal Zeiten von 250ms???MfG
Scarabol
-
Scarabol schrieb:
3.a Client beendet Hauptschleife (recv() wird ja nur einmal abgefragt)
was meinst du damit? ruft sowohl client als auch server einmal pro durchlanf recv auf? wieviele packete schickt der client maximal pro logikdurchlauf/frame ? werden alle abgefragt?
-
Genau der Client und auch der Server rufen genau einmal recv auf, pro Schleifendurchlauf.
Der Client sollte Maximal 2 Pakete pro Frame senden (eigene Position + Schuss).
Edit
So ich hab jetzt auf einmal 180ms im Schnitt.
Ich weiß nicht ganz wie ich prüfen kann wann das Packet auf dem Server ankommt, weil die Differenz ja "nur" 180ms beträgt...
So jetzt hab ich auf einma 16ms bis der Server antwortet ich dreh durch ich habs jetzt einfach alle 15 min ma getestet und immer andere Werte???EDIT2
So jetzt wirds freaky:
Ich hab auf der Serverseite ebenfalls eine Zeitmessung eingefügt. Er misst die Zeit vom Packet "Schuss" bis er selbst die Daten rausschickt. Das ganze sieht jetzt so aus:// Daten an Spieler zurücksenden if (players[i].connected && players[i].account->online) { // Geschossdaten senden send(clients[i],systemlist[players[i].system].bufbullet.c_str(),(int)systemlist[players[i].system].bufbullet.size(),0); if (systemlist[players[i].system].bufbullet != "&" && bullettime != 0) { cout << systemlist[players[i].system].bufbullet.c_str() << endl; cout << (getTime()-bullettime) << endl; // bullettime = 0; } // Gegnerdaten senden ...
Wenn ich das bullettime = 0; einfüge dann debugt er die Zeit nur einmal, und braucht 200ms laut Client.
Wenn ich das drinlasse spammt er die ganze Console mit den Zeiten zu, da er ja permanent Daten an den Client sendet und ich habe Schusszeiten von bis zu 12ms einfach geil da ruckelt nix mehr.MfG
Scarabol
-
Scarabol schrieb:
Genau der Client und auch der Server rufen genau einmal recv auf, pro Schleifendurchlauf.
Der Client sollte Maximal 2 Pakete pro Frame senden (eigene Position + Schuss).
damit flutest du doch den buffer von tcp wenn du maximal 60mal pro sekunde ein packet abrufst aber mehr als 60mal pro sekunde eines abschickst.
wieso holst du nicht einfach alle ab? das kann die latenz durchaus erklaeren.
-
Wie kann ich den alle Pakete abrufen?
Vielleicht so?
while ((rc=recv(clients[i],buf,sizeof(buf)-1,0)) > 0) { buf[rc]='\0'; net_input.append(buf); }
Dann muss der Socket doch "non-blocking" sein, oder?
Bleibt nur noch die Frage wie ich meinen Socket in einen non-blocking umwandle???EDIT
So konnte auch den Server umstellen und alles läuft besser als vorherVielen Dank du warst mir ne riesen Hilfe!!!
MfG
Scarabol