TaskManager - Timer effizient verwalten

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
  • Der TaskManager


    Hi.


    Immer wieder sehe ich Leute schreiben, dass es nicht gut sei, viele Timer zu haben und dass diese resourcenfressend seien.
    Das stimmt teilweise. Man kann 100 Timer haben, welche jede Sekunde eine Funktion ausführen. Das ist jedoch erst schlimm, wenn die einzelnen Funktionen selbst sehr viel ausführen müssen.


    Nehmen wir an, wir haben einige notwendige Timer, welche alle zusammen jede Sekunde einmal ausgeführt werden müssen. Oder wir haben eine Timer, der sehr viel auf einmal ausführen muss.


    Der Server beginnt nun womöglich zu laggen. Wo liegt denn das Problem? Das Problem ist offensichtlich, dass alle Timer aufeinmal ausgeführt werden sollen.
    Das ist etwa das gleiche wie wenn 10 Leute gleichzeitig durch eine Tür wollen. Das geht wohl kaum. Wenn sich diese Leute jedoch in eine Reihe stellen, kommen alle problemlos durch.


    Der TaskManager löst dieses Problem.


    Der TaskManager nimmt eine beliebige Anzahl Timer und wird diese dann regelmässig ausführen. Jedoch nicht alle aufeinmal, sondern er wird sie alle schön über das Zeitinterval verteilen. Somit kann der Server selbst immer wieder etwas ausführen und so den Lagg vermindern.


    Die Anwendung ist ganz einfach:

    NewTask<1000>("UpdateAllPlayers", "NVAntiCheat");
    NewTask<15000>("NeedsUpdate", "FuelUpdate", "ClockUpdate");


    Man ruft die Funktion NewTask auf, übergibt ein paar Funktionsnamen und gibt noch das Zeitinterval in den eckigen Klammern an.


    Im obigen Beispiel wird dann nach 500 MS UpdateAllPlayers aufgerufen, nach weiteren 500 MS NVAntiCheat, nach weiteren 500 MS erneut UpdateAllPlayers.
    Würde man einfach zweimal SetTimer aufrufen, würden alle 1000 MS UpdateAllPlayers und NVAntiCheat gleichzeitig ausgeführt werden...
    Also:

    Code
    500 ms -> UpdateAllPlayers
    1000 ms -> NVAntiCheat
    1500 ms -> UpdateAllPlayers
    2000 ms -> NVAntiCheat
    2500 ms -> UpdateAllPlayers
    etc...


    Anstatt

    Code
    1000 ms -> UpdateAllPlayers, NVAntiCheat
    2000 ms -> UpdateAllPlayers, NVAntiCheat
    etc...


    ACHTUNG
    TaskManager unterstützt nur Timer, welche KEINE Argumente nehmen und Timer, welche regelmässig ausgeführt werden.


    Download:
    TaskManager.inc
    ptr.inc (notwendig)

  • Im obigen Beispiel wird dann nach 500 MS UpdateAllPlayers aufgerufen, nach weiteren 500 MS NVAntiCheat, nach weiteren 500 MS erneut UpdateAllPlayers.


    Wenn ich das richtig verstanden habe, hast du hier ein Fehler.
    Wenn das in den eckigen Klammern die "gesammtzeit" ist, dann werden die 3 Tasks nach 333 ms ausgeführt
    000 - 333 -> Task 1
    333 - 666 -> Task 2
    666 - 1000 -> Task 3