[Qt4]Qtcp netwerk lag

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo iedereen,

Ik ben bezig met een qt spel te maken. Tetris over het netwerk. Ik stuur bij elk keypressEvent de coordinaten van een tetrisblokje door via QtcpSocket. Elke keer als een blokje de onderkant bereikt stuur ik de coordinaten van heel het bord door. Dit is een array van 220 bytes dat ik doorstuur aan data.

Als ik alleen de coordinaten van mijn blokje doorstuur en het doorsturen van het het board in commentaar zet werkt alles. Het werkt eveneens als ik de coordinaten in commentaar zet en alleen de data van mijn board doorstuurt. Maar als ik beide doorstuur komt de data veel te laat aan. Het probleem duikt op nadat het eerste blokje de onderkant bereikt en dus de coordinaten van het hele board worden doorgestuurd. Dan komt de data vertraagd aan en dit word trager en trager. Ik weet echt niet meer waar het probleem zit. Ik heb alle signalen in commentaar gezet voor te troubleshooten maar ook dit werkt niet. Moet ik soms nog een buffer leegmaken van datastream?

Ik weet dat tcp checkt of de data is aangekomen maar 220 bytes om de halve seconden doorsturen moet nu toch wel doenbaar zijn.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
void client::get_game_data()
{
    QByteArray data_board;
    data_board.resize(220);
    QByteArray data;
    data.resize(8);
    QDataStream in(tcp_socket);
    QString id_action;
    quint8 corx,cory,shape;

    in >> id_action;


    qDebug()<<"id action" << id_action;
    if(id_action=="start")
        {
            emit start_game_command();
            qDebug()<<"game zou moeten starten";
        }
    else if(id_action=="naam")
    {
        in >> tegenspeler_naam;
    }
    else if(id_action == "bord") <--- dit werkt niet goed
    {
        in >> data_board;

        //    emit client_set_board(data_board);
            qDebug()<<"gebeurt";
       //     emit update_board();
    }

    else if(id_action=="cor")  <--- dit werkt niet goed
    {
        in >> corx >> cory >> shape ;
        in >> data;
        qDebug()<< "status is = "<< in.status();

   //     emit set_piece(corx,cory,shape);
     //   qDebug()<< "corx : "<<corx<<"cory : "<<cory<<"shape : "<<shape;

            int k = 0;
            for(int i=0;i<4;i++)
            {
                for(int j=0;j<2;j++)
                {
                    set_coordinates(i,j,(int) data[k]);
                    k++;
                }

            }

    }
   // emit update_board();
}


P.S Excuses voor de niet zo duidelijke layout van mijn code. Dit komt door al het geknip en geplak van te troubleshooten.
Ik hoop dat iemand mij kan helpen.

Acties:
  • 0 Henk 'm!

  • PSU_freak
  • Registratie: December 2005
  • Laatst online: 08:00
Flush aanroepen bij het verzenden, dat zou er voor moeten zorgen dat data niet opgespaard wordt.
http://qt-project.org/doc/qt-4.8/qabstractsocket.html#flush

En als het echt realtime moet is de overweging voor UDP ook de moeite waard.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
PSU_freak schreef op zondag 13 mei 2012 @ 22:15:
Flush aanroepen bij het verzenden, dat zou er voor moeten zorgen dat data niet opgespaard wordt.
http://qt-project.org/doc/qt-4.8/qabstractsocket.html#flush

En als het echt realtime moet is de overweging voor UDP ook de moeite waard.
Met de flush gaat het inderdaad beter. Nu lukt het al om twee lijnen vlot te laten lopen. Ik heb het volgende gedaan:

code:
1
2
3
4
5
void server::send_data(QByteArray data)
   {
       connection->write(data);
       connection->flush();
   }


Zou de lag nu nog aan de kant van de zender liggen of aan de ontvanger? Hij lijkt de data echt ergens te bufferen. Ik snap niet dat iets traag kan worden van om de halve moment max 300 bytes door te sturen.

Ik ga het ook eens overwegen met udp maar ik zou graag eerst dit probleem oplossen omdat het normaal met tcp ook wel moet lukken.

Edit: Het is echt volledig random wanneer de verbinding traag wordt. Soms gebeurd het pas na 15 blokjes.

[ Voor 5% gewijzigd door Verwijderd op 14-05-2012 00:26 ]


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16-09 22:43
Als je een low latency packet based verbinding wilt moet je geen TCP nemen, UDP is dan een logischer keuze.
Je zit op dit moment waarschijnlijk tegen het Nagle algorithme van je OS te vechten.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • TheNephilim
  • Registratie: September 2005
  • Laatst online: 17-09 11:07

TheNephilim

Wtfuzzle

Inderdaad word bij gaming altijd UDP gebruikt. Al zou je af en toe met TCP misschien wel even kunnen syncen of iets dergelijks om zeker te weten dat de cruciale spelonderdelen kloppen op beide PC's.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb udp gebruikt nu en alle problemen zijn verdwenen. Bedankt voor de tips!

Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 18-09 21:46

Matis

Rubber Rocket

Ik weet niet precies hoe het in C++ / Qt geregeld is met string comparison, maar daar zit mogelijk ook nog een potentiële bug. Vooral ook omdat je aangeeft dat "het niet goed werkt".
C++:
1
bool QString::operator== ( const QString & other ) const


Returns true if string other is equal to this string; otherwise returns false.

The comparison is based exclusively on the numeric Unicode values of the characters and is very fast, but is not what a human would expect. Consider sorting user-interface strings with localeAwareCompare().

[ Voor 4% gewijzigd door Matis op 16-05-2012 20:01 ]

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Verwijderd schreef op maandag 14 mei 2012 @ 23:21:
Ik heb udp gebruikt nu en alle problemen zijn verdwenen. Bedankt voor de tips!
Ik durf maar betwijfelen dat alle problemen zijn opgelost.
Heb je al gedacht aan wat packet loss doet met je spel?

ASSUME makes an ASS out of U and ME

Pagina: 1