Frage(n) bezüglich Sekundentimern

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Guten Tag,


    Derzeit stehe ich vor einer schweren Entscheidung.
    Es geht um Sekundentimern.


    Derzeit sieht es bei mir so aus:


    Mehrere Globale Sekunden Timer (6) welche mit der Include ProTimer verknüpft sind. In diesen werden über foreach Spieler bzw. Spieler variablen angesprochen.
    Diese Sekunden Timer werden nach Serverstart in einer gewissen Zeit differenz gestartet sodass sie niemals Gleichzeitig durchlaufen.


    Dieses System hielt ich lange für sehr Gut.


    Doch nun zu meinem Problem. Es scheint sich ein Bug in einem der SekundenTimern (4) eingenistet zu haben, welcher nur bei gewissen Zuständen zu Erscheinung kommt.


    [12/11/13,20:59:59] [debug] #0 000a1ae0 in public SekundenTimer4 () from BE-Script.amx
    [12/11/13,20:59:59] [debug] #1 003b11e4 in public ProTimer () from BE-Script.amx
    [12/11/13,21:00:00] [debug] Run time error 4: "Array index out of bounds"
    [12/11/13,21:00:00] [debug] Accessing element at index 65535 past array upper bound 159
    [12/11/13,21:00:00] [debug] AMX backtrace:
    [12/11/13,21:00:00] [debug] #0 000a1ae0 in public SekundenTimer4 () from BE-Script.amx
    [12/11/13,21:00:00] [debug] #1 003b11e4 in public ProTimer () from BE-Script.amx


    Das Einzige was ich bis jetzt anhand der Logs heraus bekommen konnte ist, dass dieser Fehler durch einen Spieler zu Stande kommt.


    Dieses Problem hat mich nun ein wenig Stutzig gemacht, ob Spieler bezogene Sekunden Timer (SetTimerEx)
    nicht doch sinnvoller wären.


    1) Würde das Problem nur den Spieler betreffen der das Problem verursacht.
    2) Ressourcen Sparender? Ich weiß es nicht, ich hoffe ihr könnt mir helfen.


    Was meint ihr? Ich hoffe ihr habt Tipps bzw mehr Erfahrung in diesem Thema.


    Danke


    mfg Mika

  • Hey Mika :)
    Die Zahl 65535 steht immer für irgendwelche ungültigen Werte.
    Ist im Timer etwas mit Pings oder mit Fahrzeugen?
    Siehe a_samp.inc:
    INVALID_PLAYER_ID
    INVALID_VEHICLE_ID
    INVALID_OBJECT_ID
    INVALID_3DTEXT_ID
    INVALID_TEXT_DRAW


    Sehr vielfältig.
    Schau dir mal den Wiki-Beitrag für GetPlayerPing an.

  • Hey Kevin,


    Danke für dein Beitrag.


    Hab mir den Timer noch einmal angeschaut und Funktionen mit den in der Zeit ausgeführten Befehlen angeschaut.
    Habe dabei eine mögliche Ursache gefunden.


    Danke dir.


    Trotzdem möchte ich die Frage, ob Sekundentimer per SetTimerEx besser ist noch ein mal in den Raum werfen.


    mfg Mika

  • Das weiß ich auch, danke trotzdem.
    Habe euch gerade mal ein Beispiel geschrieben um es zu Verdeutlichen.


    Jetziger Aufbau:


    public OnGameModeInit()
    {
    SetTimer("StartSekundenTimer1",333,false);
    }
    public StartSekundenTimer1()
    {
    SetProTimer("SekundenTimer1",1000, true);
    }
    public SekundenTimer1()
    {
    foreach(new playerid : Player)
    {
    if(IstCool[playerid] == true)
    {
    //...
    }
    }
    }


    Eventuell besserer Aufbau?!


    public OnPlayerConnect(playerid)
    {
    new SekTimer[playerid] = SetTimerEx("SekundenTimer1", 1000,1, "i", playerid);
    return 1;
    }
    public SekundenTimer1(playerid)
    {
    if(IstCool[playerid] == false)
    {
    //...
    }
    }
    public OnPlayerDisconnect(playerid)
    {
    KillTimer(SekTimer[playerid);
    return 1;
    }


    Ist nur ein Beispiel.



    Danke euch


    mfg Mika

  • Eine genaue Antwort kann Ich dir darauf nicht geben.
    Mit der zweiten Methode würdest du die Aktivitäten viel besser aufteilen ...
    Ich würde dir empfehlen bei allen Sekunden-Timen mal zu schauen wie lange sie benötigen um ausgeführt zu werden.
    In der Zeit kann SA-MP, das weißt du ja auch, nichts anderes machen.
    Beispiel: Was fällt mehr auf?
    1. Jede Minute ein 2-Sekunden-Lagg,
    2. oder aber jede Sekunde eine Unterbrechung von sagen wir 5ms?
    Ich bezweifle, dass man das 2. Überhaupt merkt.
    1. -> Aktuell
    2. -> Besser aufgeteilt


    Dazu noch mehrere Sachen:
    1. ProTimer genauer angucken ob das überhaupt was bringt.
    2. Primzahlen verwenden.
    3. Muss unbedingt alles in Sekundenschritten runtergezählt werden? Beispiele: Payday,Mute oder Job-Cooldown ...
    4. Hier: http://forum.sa-mp.com/showthread.php?t=375925 SetTimer(Ex) lesen.


    Ich glaube das war's erstmal.
    Genau deine Frage habe ich jetzt zwar nicht beantwortet, hoffe aber, dass dich das weiter bringt!


    MfG Kevin

  • Der SekundenTimer braucht gerade mal 2 Millisekunden um ausgeführt zu werden.
    Mit Pro Timern zu arbeiten ist wie gesagt sehr gut.
    1) Nur 1 Timer
    2) Kein Langer Code wird auf einmal ausgeführt.


    Bei SetTimerEx hätte man bei 60 Spielern 60 Timer, Welche sich eventuell auch überschneiden.


    [12/12/13,16:59:21] Time taken to execute SekundenTimer1: 0
    [12/12/13,16:59:21] Time taken to execute ProTimer: 2
    [12/12/13,16:59:22] Time taken to execute ProTimer: 1
    [12/12/13,16:59:22] Time taken to execute SekundenTimer2: 0
    [12/12/13,16:59:22] Time taken to execute ProTimer: 1
    [12/12/13,16:59:22] Time taken to execute ProTimer: 1
    [12/12/13,16:59:22] Time taken to execute Sekundentimer4: 0
    [12/12/13,16:59:22] Time taken to execute ProTimer: 1
    [12/12/13,16:59:22] Time taken to execute SekundenTimer5: 0
    [12/12/13,16:59:22] Time taken to execute ProTimer: 1
    [12/12/13,16:59:22] Time taken to execute SekundenTimer6: 0
    [12/12/13,16:59:22] Time taken to execute ProTimer: 1
    [12/12/13,16:59:22] Time taken to execute ProTimer: 1


    Inwiefern sich das auswirkt weiß ich nicht.


    mfg Mika

  • Naja, hast du das aufm Testserver getestet ohne Spieler?
    Wenn, dann bringt das ja nicht sonderlich viel der Test.