Problem mit Netzwerk-Code



  • Hallo, ich programmiere zur Zeit ein netzwerkfähiges Pong (Spiel) und habe folgenden Code:

    void __fastcall TForm1::ClientSocket1Read(TObject *Sender,
          TCustomWinSocket *Socket)
    {
    AnsiString tmp;
    tmp=Socket->ReceiveText();
    
    //Commands:
    //y = Ball Y
    //x = Ball X
    //w = Angle
    //g = Start Ball Movement
    //p = Paddle X
    //s = Ball Speed
    
    do
    {
      AnsiString NetCommand=tmp.SubString(1,1);
      AnsiString NetLength=tmp.SubString(2,3);
      AnsiString NetValue=tmp.SubString(4,HexToInt(NetLength));
      tmp.Delete(1,HexToInt(NetLength)+3);
    
      if (NetCommand=="y")
        Ball1.SetY(StrToFloat(NetValue));
    
      else if (NetCommand=="x")
        Ball1.SetX(StrToFloat(NetValue));
    
      else if (NetCommand=="w")
        Ball1.SetAngle(StrToFloat(NetValue));
    
      else if (NetCommand=="g")
        Timer1->Enabled=true;
    
      else if (NetCommand=="p")
        Paddle2.DrawPaddle(StrToInt(NetValue));
    
      else if (NetCommand=="s")
        Ball1.SetSpeed(StrToFloat(NetValue));
    
      else if (NetCommand=="t")
        Ball1.SetSize(StrToInt(NetValue));
    
    }
    while (tmp!="");
    }
    

    Dies funktioniert von localhost->localhost auch 1A nur wenn ich es dann übers Netzwerk teste dann ruckelt die ganze Geschichte (Paddle Movement) furchtbar und das bei 1ms Verzögerung. Woran könnte das liegen/Wie könnte ich das beheben?

    Gruß Mark



  • wieviele befehle je sekunde überträgst du ?
    btw. läuft die iegentliche darstellung in einem eigenen thread ?
    versuchs doch mit interpolieren, du übermittelst wie schon angefangen von dir einfach winkel, startposition und zu erwartendes ziel (wenn der winkel nicht genau genug ist) der client empfängt das und simuliert praktisch parallel mit dem anderen PC die bewegung des ball.

    ich habe selber derartig zeitkritische sachen noch nicht probiert, wäre nur ein ansatz.



  • ja so habe ich es mit dem ball auch gemacht der wird interpoliert und nur bei nem WallHit oder sonstigem wird zum syncen die neue XY-Position und der neue Winkel übertragen

    problem ist das bewegen und anzeigen der Paddles.. da übertrage ich jede X-Positionsänderung sind so ca 50/Sekunde würdsch mal schätzen und jeder Befehl hat dann 6 Byte.

    also 50x6 sind 300byte also an der übertragung kanns ja irgednwie nit liegen -.-

    und nein ich erledige alles im haupthread. habe auch schon versucht nen seperaten thread fürs Empfangen und einen fürs befehlsinterpretieren erstellt aber ruckelt dann auch.. eine lösung hatt ich da wars mal ganz akzeptabel aber da strüzte das programm nach einiger zeit mir der fehlermeldung "bild/leinwand erlaubt kein zeichnen" ab.. denke mal dass dan der haupt und der andere thread gleichzeit was machen wollten



  • mh NUR 300 byte sind gut, jeder einzelne befehl braucht seine zeit!!! die größe ist dabei RELATIV irrelevant.

    reduzier die positionermittlung der paddels mal auf ne eventsteuerung. jede paddelbewegung löst eine übertragung aus und dann lässt du das paddel einfach "langsam" loslaufen und unterbrichst die übermittlung sobald die position des paddels und die des tatsächlien cursor übereinstimmen.

    boah sorry ich bin müde kann sein das sich das verworren anhört aber es kann sehr wohl an 50 paketen je sekunde liegen.

    da alles im hauptthread läuft, kann es auch gut sein das der empfang ein winziges bisschen verzögert und dadurch die "laggs" entstehen



  • hm verstehe ich jetz nicht so ganz sorry

    aber habe noch vergessen zu erwähne dass, wenn ich die maus auf dem Formular bewege und dadurch das Ereignis

    void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift,
    int X, int Y)

    ausgelöst wird, dann funktioniert es EINWANDFREI. Also während Spieler 1 sein Paddle bewegt ist das andere auch flüssig und das raffe ich dann gar nicht mehr


Anmelden zum Antworten