Angesammelte Daten verwerten

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
Nalid
Beiträge: 26
Registriert: 21. Februar 2011 23:49

Angesammelte Daten verwerten

Beitrag von Nalid »

Hi, ich habe das Spiel Tron programmiert, und es läuft über Lan. Es funktioniert ohne Probleme, nur wenn der eine Spieler dem anderen i.was schickt, werden die Daten zu langsam eingelesen und verwertet.

Wenn der Spieler schnell hintereinander mehrere Befehle rüber sendet, werden die zwar der Reihenfolge nach abgehandelt aber es sammelt sich an und ich hab nun versucht mit ner For-Schleife die Befehle abzufangen und zu verwerten, aber ich hab immer noch das selbe Problem...


Code: Alles auswählen

void tron::startRead()
{
    //anzahl der bytes
    int anzahlbytes = pServerClient->bytesAvailable();

    //wenn weniger als 1 byte warten sonst aus der methode kicken
    if (anzahlbytes < 1)
        return;

    // anzahl bytes lesen
    QByteArray empfangpacket;
    empfangpacket = pServerClient->read(anzahlbytes);

    //eingelesenes bearbeiten
    for(int test = 0;test <= anzahlbytes;test++){
        switch(empfangpacket[test]){
        case 's':QMessageBox::information(this,"Bereit?","Wenn sie bereit sind bitte Bereit anklicken.",QMessageBox::Ok);
            ui->pushButton_bereit->setEnabled(true);
            erster=false;
            break;
        case 'g': startspielok();
            break;
        default :
                richtungzahl = empfangpacket[test];
        qDebug()<<"richtung: "<<richtungzahl;
        richtung();
        break;
    }
    }

    update();
}


Hoffe jemand kann mir helfen, denn ich sitze schon seit 2 Tagen davor und mir fällt nichts mehr ein.
androphinx
Beiträge: 170
Registriert: 26. Januar 2009 09:19
Wohnort: 127.0.0.2

Beitrag von androphinx »

Hallo Nalid,
also aus deinem Quellcode kann man jetzt nicht allzu viel erkennen, ich weiß so leider nicht wie das funktioniert, was du da geschrieben hast.

Rein aus der Funktion, die du hier rein gestellt hast, stelle ich aber einfach mal folgende Vermutung an. Deine Funktion tron::startRead() braucht zu lange. Ich vermute mal, dass es mit den Funktionsaufrufen zu startspielok(), richtung() und update() zusammenhängt. Solange diese Funktionen laufen, wird die Funktion geblockt, heißt du kannst erstmal keine neuen Daten annehmen, obwohl sie ordnungsgemäß ankommen und du sie später auch lesen kannst.

Empfehlung von meiner Seite, wenn meine Vermutung zutreffen sollte: Setze dich mal mit Threads auseinander und trenne die Netzwerk- und die Spielebene.

Mfg androphinx
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Re: Angesammelte Daten verwerten

Beitrag von solarix »

Nalid hat geschrieben:...nur wenn der eine Spieler dem anderen i.was schickt, werden die Daten zu langsam eingelesen und verwertet.
"langsam" ist was subjektives... bitte definiere "langsam"... reden wir hier von 100ms oder von 10s oder von..?

Bedenke auch, dass das die meisten TCP/IP-Implementierungen im Betriebssystem versuchen, die Bandbreite zu optimieren. Das bedeutet, dass wenn der Client nur 1 Byte sendet, noch etwas gewartet wird bis es sich "lohnt", ein Frame zu versenden (also entweder noch mehr Daten kommen oder ein Timeout erreicht wurde).

Bei deinem "1-Byte-Protokoll" könnte auch das noch Einfluss haben. Es könnte also sein, dass es nicht am Empfänger liegt, sondern (auch) am Sender. Verifizieren kannst du das z.B. mit "Wireshark"..

hth..
Nalid
Beiträge: 26
Registriert: 21. Februar 2011 23:49

Beitrag von Nalid »

ne hab das schon überprüft, es sammelt sich wirklich an -.- wird alle 70 ms abgearbeitet...
entweder ich drossel die geschwindigkeit ab, oder mache das spielfeld kleiner, auf beides hab ich eigentlich keine lust, da es dann weniger spass macht -.-
Antworten