OnPlayerUpdate - Warum man es meiden sollte

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
  • Da es doch tatsächlich noch eine Menge Skripter gibt,
    die "OnPlayerUpdate" nutzen, möchte ich euch mal erklären,
    warum die berühmte Aussage

    Verbrauchen tut es trotz OnPlayerUpdate Benützung wenig an Leistung, was ich vom Wissen her kenne.


    nicht richtig sein kann.


    Nehmen ich mal beispielsweise folgende Funktion,
    welche das Auto eines Spielers unverwundbar machen soll:

    forward checkfunc(playerid);
    public checkfunc(playerid)
    {
    if(IsPlayerInAnyVehicle(playerid)) SetVehicleHealth(GetPlayerVehicleID(playerid),1000.0);
    }


    So sähe der Aufruf bei OnPlayerUpdate aus:

    public OnPlayerUpdate(playerid)
    {
    checkfunc(playerid);
    return 1;
    }


    Und so bei einem Timer:

    public OnPlayerStateChange(playerid,newstate,oldstate)
    {
    if(newstate == 2)
    {
    KillTimer(GetPVarInt(playerid,"healtimer"));
    SetPVarInt(playerid,"healtimer",SetTimerEx("healfunc",250,0,"i",playerid));
    }
    else KillTimer(GetPVarInt(playerid,"healtimer"));
    return 1;
    }


    forward healfunc(playerid);
    public healfunc(playerid)
    {
    if(!IsPlayerConnected(playerid) || !IsPlayerInAnyVehicle(playerid)) return 0;
    SetPVarInt(playerid,"healtimer",SetTimerEx("healfunc",250,0,"i",playerid));
    checkfunc(playerid);
    return 1;
    }


    Das Ergebnis:
    OnPlayerUpdate ist zwar der einfachere Weg,führt aber in minimalen und unregelmäßigen Abständen für JEDEN Spieler die Funktion aus.
    SetTimerEx dagegen führt nur für Spieler, die Fahrer eines Autos sind, in größeren und regelmäßigen Abständen durch.


    Fazit:
    OnPlayerUpdate frisst enorm Ressourcen,
    obwohl der Code der Funktion minimal ist.
    SetTimerEx dagegen ruft nur spezifisch und seltener
    den Code auf => weitaus weniger Belastung.



    Dies war durchaus einleichtend, nicht wahr ?
    Für all die Zweifler, nehmen wir doch mal die ausführliche Erklärung
    eines erfahrenem und bekannterem Skripter, der diese Methode mag: Templer !
    Hier ist seine Erklärung, mein Kommentar steht in Grün dahinter:

    Erklärung zur Benützung von OnPlayerUpdate:
    Da manche denken "Oh mein Gott er benützt OnPlayerUpdate" will ich für andere kurz Erläutern warum ich diese Variante ausgesucht habe. OnPlayerUpdate wird ja stehts ausgeführt, wenn Spieler InGame ist (und nicht am Desktop oder GTA Menu) und es dann ca alle 0,5 Sekunden aufgerufen wird (wenn nicht kürzer). (Um EINIGES kürzer) Anstatt das ich die Timerfunktionen SetTimer und SetTimerEx verwende, nütze ich gleich OnPlayerUpdate mit einer Variable die überprüft ob so und soviele Sekunden vergangen sind (was wiederum den Server belastet) und erst dann die Überprüfung für diesen Spieler startet.(man nimmt also eine Funktion, die alle paar MS aufgerufen wird, und prüft da, ob eine Sekunde rum ist, anstatt einen Timer zu erstellen, der direkt jede Sekunde startet ? Sinn ?) Somit erspart man sich an Leistung und keine Geschwindigskeitsverluste wegen der mageren Abfrage(Im Gegenteil). Da ich leider schwer zeigen kann wieviel Leistung dieses Script vom Server verbraucht,(print wäre ein Anfang) da ich nicht wisse wie die Leistung abgemessen wird, müsst ihr es leider selber austesten wenn es unbedingt notwendig ist. Verbrauchen tut es trotz OnPlayerUpdate Benützung wenig an Leistung, was ich vom Wissen her kenne. (Der epischste Grund ;) )


    Noch Fragen ?

  • Mach doch einfach ein Test @Thommy.
    Setz unter OnPlayerUpdate mal ein Print. Dann wirst du es sehen.


    @Topic : Schön erklärt und verständlich :).

    „Auge um Auge - und die ganze Welt wird blind sein.“
    - Mahatma Gandhi

  • Klasse.
    Ist auf jeden Fall aussagekräftig.


    Ich habe das ganze wirklich mal getestet. Ich habe eine Nachricht an den Spieler schicken lassen, sobald OnPlayerUpdate ausgeführt wird.
    Ich kam auf folgende Ergebnisse:


    [18:08:23] [18:8:23:0] OnPlayerUpdate ausgeführt !
    [18:08:23] [18:8:23:0] OnPlayerUpdate ausgeführt !
    [18:08:23] [18:8:23:0] OnPlayerUpdate ausgeführt !
    [18:08:23] [18:8:23:0] OnPlayerUpdate ausgeführt !
    [18:08:23] [18:8:23:0] OnPlayerUpdate ausgeführt !
    [18:08:23] [18:8:23:0] OnPlayerUpdate ausgeführt !
    [18:08:23] [18:8:23:0] OnPlayerUpdate ausgeführt !
    [18:08:23] [18:8:23:0] OnPlayerUpdate ausgeführt !
    [18:08:23] [18:8:23:0] OnPlayerUpdate ausgeführt !
    [18:08:23] [18:8:23:0] OnPlayerUpdate ausgeführt !
    [18:08:23] [18:8:23:0] OnPlayerUpdate ausgeführt !
    [18:08:23] [18:8:23:0] OnPlayerUpdate ausgeführt !
    [18:08:23] [18:8:23:0] OnPlayerUpdate ausgeführt !
    [18:08:23] [18:8:23:0] OnPlayerUpdate ausgeführt !
    [18:08:23] [18:8:23:0] OnPlayerUpdate ausgeführt !
    [18:08:23] [18:8:23:0] OnPlayerUpdate ausgeführt !
    [18:08:23] [18:8:23:0] OnPlayerUpdate ausgeführt !
    [18:08:23] [18:8:23:0] OnPlayerUpdate ausgeführt !
    [18:08:23] [18:8:23:0] OnPlayerUpdate ausgeführt !
    [18:08:23] [18:8:23:0] OnPlayerUpdate ausgeführt !
    [18:08:23] [18:8:23:0] OnPlayerUpdate ausgeführt !
    [18:08:24] [18:8:24:0] OnPlayerUpdate ausgeführt !
    [18:08:24] [18:8:24:0] OnPlayerUpdate ausgeführt !
    [18:08:24] [18:8:24:0] OnPlayerUpdate ausgeführt !
    [18:08:24] [18:8:24:0] OnPlayerUpdate ausgeführt !
    [18:08:24] [18:8:24:0] OnPlayerUpdate ausgeführt !
    [18:08:24] [18:8:24:0] OnPlayerUpdate ausgeführt !
    [18:08:24] [18:8:24:0] OnPlayerUpdate ausgeführt !
    [18:08:24] [18:8:24:0] OnPlayerUpdate ausgeführt !
    [18:08:24] [18:8:24:0] OnPlayerUpdate ausgeführt !
    [18:08:24] [18:8:24:0] OnPlayerUpdate ausgeführt !
    [18:08:24] [18:8:24:0] OnPlayerUpdate ausgeführt !
    [18:08:24] [18:8:24:0] OnPlayerUpdate ausgeführt !
    [18:08:24] [18:8:24:0] OnPlayerUpdate ausgeführt !
    [18:08:24] [18:8:24:0] OnPlayerUpdate ausgeführt !
    [18:08:24] [18:8:24:0] OnPlayerUpdate ausgeführt !
    [18:08:24] [18:8:24:0] OnPlayerUpdate ausgeführt !
    [18:08:24] [18:8:24:0] OnPlayerUpdate ausgeführt !
    [18:08:24] [18:8:24:0] OnPlayerUpdate ausgeführt !
    [18:08:24] [18:8:24:0] OnPlayerUpdate ausgeführt !
    [18:08:24] [18:8:24:0] OnPlayerUpdate ausgeführt !
    [18:08:24] [18:8:24:0] OnPlayerUpdate ausgeführt !
    [18:08:24] [18:8:24:0] OnPlayerUpdate ausgeführt !
    [18:08:24] [18:8:24:0] OnPlayerUpdate ausgeführt !
    [18:08:24] [18:8:24:0] OnPlayerUpdate ausgeführt !
    [18:08:24] [18:8:24:0] OnPlayerUpdate ausgeführt !
    [18:08:24] [18:8:24:0] OnPlayerUpdate ausgeführt !
    [18:08:24] [18:8:24:0] OnPlayerUpdate ausgeführt !
    [18:08:24] [18:8:24:0] OnPlayerUpdate ausgeführt !
    [18:08:24] [18:8:24:0] OnPlayerUpdate ausgeführt !
    [18:08:24] [18:8:24:0] OnPlayerUpdate ausgeführt !
    [18:08:24] [18:8:24:0] OnPlayerUpdate ausgeführt !
    [18:08:24] [18:8:24:0] OnPlayerUpdate ausgeführt !
    [18:08:24] [18:8:24:0] OnPlayerUpdate ausgeführt !
    [18:08:24] [18:8:24:0] OnPlayerUpdate ausgeführt !
    [18:08:24] [18:8:24:0] OnPlayerUpdate ausgeführt !
    [18:08:24] [18:8:24:0] OnPlayerUpdate ausgeführt !
    [18:08:26] [18:8:26:0] OnPlayerUpdate ausgeführt !
    [18:08:26] [18:8:26:0] OnPlayerUpdate ausgeführt !
    [18:08:26] [18:8:26:0] OnPlayerUpdate ausgeführt !
    [18:08:26] [18:8:26:0] OnPlayerUpdate ausgeführt !
    [18:08:26] [18:8:26:0] OnPlayerUpdate ausgeführt !
    [18:08:26] [18:8:26:0] OnPlayerUpdate ausgeführt !
    [18:08:26] [18:8:26:0] OnPlayerUpdate ausgeführt !
    [18:08:26] [18:8:26:0] OnPlayerUpdate ausgeführt !
    [18:08:26] [18:8:26:0] OnPlayerUpdate ausgeführt !
    [18:08:26] [18:8:26:0] OnPlayerUpdate ausgeführt !
    [18:08:26] [18:8:26:0] OnPlayerUpdate ausgeführt !
    [18:08:26] [18:8:26:0] OnPlayerUpdate ausgeführt !
    [18:08:26] [18:8:26:0] OnPlayerUpdate ausgeführt !
    [18:08:26] [18:8:26:0] OnPlayerUpdate ausgeführt !
    [18:08:26] [18:8:26:0] OnPlayerUpdate ausgeführt !
    [18:08:26] [18:8:26:0] OnPlayerUpdate ausgeführt !
    [18:08:26] [18:8:26:0] OnPlayerUpdate ausgeführt !
    [18:08:26] [18:8:26:0] OnPlayerUpdate ausgeführt !
    [18:08:26] [18:8:26:0] OnPlayerUpdate ausgeführt !
    [18:08:26] [18:8:26:0] OnPlayerUpdate ausgeführt !
    [18:08:26] [18:8:26:0] OnPlayerUpdate ausgeführt !
    [18:08:26] [18:8:26:0] OnPlayerUpdate ausgeführt !
    [18:08:26] [18:8:26:0] OnPlayerUpdate ausgeführt !
    [18:08:26] [18:8:26:0] OnPlayerUpdate ausgeführt !
    [18:08:26] [18:8:26:0] OnPlayerUpdate ausgeführt !
    [18:08:26] [18:8:26:0] OnPlayerUpdate ausgeführt !
    [18:08:26] [18:8:26:0] OnPlayerUpdate ausgeführt !
    [18:08:26] [18:8:26:0] OnPlayerUpdate ausgeführt !
    [18:08:26] [18:8:26:0] OnPlayerUpdate ausgeführt !
    [18:08:26] [18:8:26:0] OnPlayerUpdate ausgeführt !
    [18:08:26] [18:8:26:0] OnPlayerUpdate ausgeführt !
    [18:08:26] [18:8:26:0] OnPlayerUpdate ausgeführt !
    [18:08:26] [18:8:26:0] OnPlayerUpdate ausgeführt !
    [18:08:27] [18:8:26:0] OnPlayerUpdate ausgeführt !
    [18:08:27] [18:8:26:0] OnPlayerUpdate ausgeführt !


    Somit wird OnPlayerUpdate im Durchschnitt 30 mal pro Sekunde ausgeführt.
    Hierbei bin ich aber nur rumgerannt und hab an und an mal einen Befehl genutzt.

  • Also was Trooper schreibt stimmt... Jedoch gibt es eine Funktion wo man es nutzen muss :)
    Man kann mit OnPlayerUpdate die Abfrage starten ob der Spieler iG ist oder nicht (ESC = Nicht in Game)
    Nur für diese Abfrage ist OnPlayerUpdate perfekt.


    Man sollte klar so wenig wie möglich da rein schreiben. Alternativ beste Lösung
    Einfach eine Variable setzen sobald er nicht mehr iG ist.


    Ansonsten absolut OnPlayerUpdate vermeiden

  • Das Toturial ist sehr hilfreich für Anfänger und Fortgeschrittene,
    mann kann daraus viel lernen das mann es so und so machen kann
    nur das eine ist besser als das andere und so schön das du es den
    mitgliedern und Lesern erklärt hast Lg.

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen