39DLL- TCP ausgelastet?

  • GM 7
  • 39DLL- TCP ausgelastet?

    Hallo Leute! Ich arbeite schon länger an einer 16 Spieler LAN Multiplayer engine. (wenn ich frei habe.)
    Nun habe ich aber erneut ein Problem das ich nicht wirklich lösen kann. (zumindest fällt mir keine alternative ein.) Es geht um ein Performance Problem:

    Das Spiel hängt beim Createn eines Raumes. Ich habe herumgesucht und das Problem gefunden. Es lieggt an 2 Zeilen:
    im Step event eines Objekts habe ich folgende abfrage eingefügt:

    GML-Quellcode

    1. for(tempID=0;tempID<=15;tempID+=+1){
    2. size = receivemessage(global.ingameIndex[tempID,0]);


    folgendes: Die For schleife in kombination mit der receivemessage macht das System fertig. Ich will das der Host 16 Spieler (16 Clients) abfragt. Also: er soll 30 mal in der Sekunde eine For schleife mit 16 Clients abrufen. Jedoch ist das so performancelastig, das mein 3 GHz Pentium 4 Rechner dabei stillsteht. (Also das Game)

    Hat jemand eine Performance freundlichäre Idee wie ich 16 Clients abfragen könnte?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von LEWA ()

  • Objecte? Das läuft super.
    obj_remote( z.B.) speichert die Socket ID die dir tcpaccept zurück gibt. Dann prüfst du im Step Event:

    GML-Quellcode

    1. while(1)
    2. {
    3. var size,mid;
    4. size=receivemessage(socketid);
    5. if (size<0) { break; } //Keine Nachricht
    6. if (size==0) { instance_destroy(); }//Socket Disconnect
    7. mid=readbyte();
    8. //Auslesen
    9. }

    und um z.B. an alle Spieler zu senden:

    GML-Quellcode

    1. with(obj_remote)
    2. {sendmessage(socketid);}

    #edit
    "39DLL- System" :cursing: sag einfach TCP.
    wupto.net/ Nicht meine Seite!
    We love Koalas.

    GM-D-Spam-o-Meter: 32%
  • Also ich habe es folgendermaßen gemacht:
    tcpaccept läuft schon im Step event unuterbrochen. Das ist kein Problem. Ich möchte ja das man schon bei bereits exestierenden Sessions im Netzwerk beitreten kann. Falls also eine TCPAccept abfrage kommt, speicher er die ID in einem Array
    (ingame Index[Spielernummer,0] = socket ID) verstehst du? nun soll er aber mit der for schleife jede Socket ID abrufen. (Da das die Aufgabe des Hosts sein sollte.) eigentlich habe ich diese for schleife mit receivemessage nur dazu da um zu überprüfen ob eine Verbindung mit allen 16 Clients immernoch besteht.

    Jedoch ist die For schleife in Kombination mit receivemessage nicht gerade so performancefreundlich. Das was du mir da gezeigt hast, giltet nur für eine 1 zu 1 Verbindung.
    Ich habe aber einen Host und dementsprechend viele Clients.

    (PS: so wie du es sagst habe ich es ja gemacht. Problem: ich habe 15 verschiedene Socket IDs.) (wenn man den Host nicht mitzählt.)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von LEWA ()

  • Wie hier(in der gm6) gezeigt , benutzt es Objecte.
    Wir erstellen ein obj_master wo nach Spielern sucht:

    GML-Quellcode

    1. //Create
    2. listen=tcplisten(port,16,1);

    GML-Quellcode

    1. //Step
    2. var player;
    3. player=tcpaccept(listen,1);
    4. if (player>0)
    5. {
    6. var i;
    7. i=instance_create(x,y,obj_remote);
    8. i.socketid=player;
    9. //Hier sagen wir welche Spiele schon da sind und den anderen das ein neuer da ist
    10. //Das solltest du hinbekommen
    11. }
    Alles anzeigen

    In obj_remote prüfen wir ob wir Master sind und prüfen dann ob eine Nachricht angekommen ist. So schwer ist das doch nicht.
    wupto.net/ Nicht meine Seite!
    We love Koalas.

    GM-D-Spam-o-Meter: 32%
  • Hmmm... ic hverstehe aber nicht wirklich was die Objekte bringen sollen. Sie verbrauchen unnötig Ressourcen, es muss dafür auch wieder eine eigene Engine geproggt werden... (und meine ist ja schon fertig.) Blos diese Anhängung mit der For schleife.

    Gibt es denn noch eine möglichkeit außer die mit den Objekten? Ich will nähmlich nicht alles von neu Schreiben. (Hab gut nen Monat für die Engine gebraucht.)
  • Versuch es doch einfach mit:

    GML-Quellcode

    1. for(tempID=0;tempID<=15;tempID+=+1){
    2. if (global.ingameIndex[tempID,0]!=0)
    3. {
    4. size = receivemessage(global.ingameIndex[tempID,0]);
    5. if (size==0) { global.ingameIndex[tempID,0]=0;}
    6. else if (size>0)
    7. {
    8. mid=readbyte(); //und so weiter
    9. }
    10. }

    Wenn 0 am Anfang eingestellt . Mit Objecten ist es aber übersichtlicher finde ich.
    wupto.net/ Nicht meine Seite!
    We love Koalas.

    GM-D-Spam-o-Meter: 32%