Fragen zu ressourcenspparendem Scripting

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
  • Hallo


    Evt. tönt jetzt der Titel etwas generell, jedoch habe ich bis auf ein Tutorial über Optimierung (for-Schleifen, New`s ) nicht wirklich vieles gefunden, was mir hilft. Nun frage ich einfach mal so in die Runde hinein:


    1.Frage
    Wo gibt es grosses Potenzial, um während dem Leerlauf (Spieler tut ausser Schreiben im Chat nichts) Ressourcen einzusparen ?


    2.Frage
    Wie verhält sich ein Enum mit sagen wir 60 Einträgen ? (PlayerInfo). Ist sowas sinnvoll ?


    3.Frage
    Wie scripte ich am Besten Schleifen ? Nimmt man am Besten immer if-Schleifen und vermeidet else if oder ist ein if+else genauso ressourcenfressend wie ein else if ? Gibt es da ein paar gute Tipps, wie man da sam besten macht ?


    4.Frage
    Gibt es eine gute Möglichkeit, Timer sinnvoll auszuführen. Ich habe momentan so etwas :
    OnGameModeInit:
    SetTimer("TimerLoader250",250,1);
    SetTimer("TimerLoader1000",1000,1);
    SetTimer("TimerLoader60000",60000,1);
    SetTimer("TimerLoader1800000",1800000,1);


    public TimerLoader250()
    {
    NagelBand_Timer();
    Blitzer_Timer();
    return 1;
    }


    public TimerLoader1000()
    {
    BloodAlcoholLevel();
    TorSystem();
    bankcountdown();
    return 1;
    }


    public TimerLoader60000()
    {
    Updating();
    return 1;
    }


    public TimerLoader1800000()
    {
    Lottotime();
    return 1;
    }


    Wäre um ein paar Tipps sehr froh, da mein Server im Leerlauf sehr laggt ;)
    MfG dUDA

  • frage 4 ist sagen wir sinnlos da man gleich jeden timer einzelnt machen kann.
    mache ein Timer der andauert eine variable hoch zählt bis zu 1stunde also das dann da 3600000 ist und so machst du nach dem addieren der variable ein switch und machst halt die interwalle so wie du sie brauchst vorteil es läuft nur ein timer und er führt die sachen nach einander aus.
    sagen wir blitztimer und nageltimer den einen führst du bei 245 aus den nächsten bei 250 so laggt es nicht natürlichen wenn du ca 20 functionen in abständen von 5 ms kann es natürlich auch anfangen zu lagen

  • beim Timerinterval eine Primzahl reinschreiben und hier mal ein beispiel was die meisten scripter machen


    if(scripter==1)
    {
    SetPlayerPos();
    }
    else
    {
    SendClientMessage();
    }


    if(scripter!=1) return SendCLientMessage();
    //und hier dann der code


    oder


    if(gTeam[playerid]==1) return blabla;
    if(gTeam[playerid]==2) return bumbum;
    if(gTeam[playerid]==3) return sumsum;


    dafür gibt es ja switch ;)


    switch(gTeam[playerid])
    {
    case 0: return blabla;
    case1: return dada;
    case2:
    {//du kannst auch hier klammern setzen
    SetPlayerPos();
    }
    }


    ob alles davon ressourcensparend ist , weiß ich nicht aber zu 100% übersichtlicher

  • Hallo


    Das mit der if-Abfrage und dann dem Code habe ich bei strcmp vorallem gesehen. Jedoch frage ich mich, ob es viel bringt, alle CMds so umzubauen ? Wie viel Ressourcen braucht eine else if Schleife im Verhältnis zu einer if-Abfrage (Also ist es sinnvoll oder gibt es Punkte mit mehr Potenzial ?).


    dUDA


    //Edit
    Ja das mit der Primzahl hab ich auch gelesen, werde es dann mal machen nachher

  • naja mal weg von den if abfragen ^^ , was sich auch bringt statt für jeden player variable oben ein new dienst[MAX_PLAYERS];


    wäre es sinvoller mit


    SetPVarInt und GetPVarInt zu arbeiten das bringt viel weil sonst erstellst du für jeden spieler eine variable dienst obwohl er kein Polizist ist ;)


    edit: Goldkiller man sollte meiner Meinung nach ein Gleichgewicht herstellen ;)
    edit2: Vor allem ob es sinnvoll ist ein PVar zu erstellen obwohl man es sowieso bei jedem Spieler braucht und sehr oft , ich überlege da immer ein bisschen

    2 Mal editiert, zuletzt von zabus ()

  • Wir haben dazu mal einen Extra Thread gehabt. Code Optimierung


    1. OnPlayerUpdate so gut wie nicht benutzen.
    2. Genau so wie ein normales Array.Ob du jetzt immer extra
    new PlayerInfo_Level[MAX_PLAYERS],PlayerInfo_Money[MAX_PLAYERS],...
    hast oder es direkt
    new PlayerInfo[MAX_PLAYERS][e_PlayerInfo]; // e_PlayerInfo ist natürlich enum
    ist egal,nur ist es für die meisten übersichtlicher,ist aber Geschmackssache.


    3. - Glaube kaum, dass es da große Unterschiede gibt.Meine aber switch() ist langsamer als if,else if,else ... .
    4. http://forum.sa-mp.de/wbb/san-…de-multitimer/#post371586
    Dazu gibt es auch ein ausführliches Tutorial auf Englisch : http://forum.sa-mp.com/showthread.php?t=61322


    Zitat

    SetPVarInt und GetPVarInt zu arbeiten das bringt viel weil sonst erstellst du für jeden spieler eine variable dienst obwohl er kein Polizist ist ;)


    Da hast du aber das Problem CPU vs Speicher.Denn PVars sind defintiv nicht schneller als Variablen ;)


    //Edit:
    Ein super Thread dazu,aber auch in Englisch.Code optimisations , kann ich nur empfehlen.Bis auf Lists und Binary Trees konnt Ich mir auch alles davon beibringen.

  • Immer darauf achten ...


    • Ob Variablen mehrmals verwendet werden können ohne eine extra Variable zu erstellen
    • Den Index einer Variable falls vorhanden auf realistische Größen bringen sprich du hast einen String der niemals mehr als 10 Stellen braucht setzt du ihn Maximal auf 12 oder direkt auf 10
    • Hast du einen String den du mehrmals in mehreren Aktionen verwendest machst du so groß wie er in den nächsten Aktionen maximal gebraucht werden könnte.
    • Bei mehreren Variablen in einer Array bzw. Enum benutzen alle Variablen zusammentragen die für diese Array gebraucht werden und sie dann zusammenfassen

    enum daten{ var0,var1 }
    new array_[50][daten];


    • Anweisungen so kurz wie Möglich halten :


    // Unlogisch ...
    IstVariableWahr(eingabe)
    {
    if(eingabe == 5)return 1;
    else return 0;
    }



    // Logisch...
    IstVariableWahr(eingabe)return (eingabe == 5) ? (1) : (0);


    Für einzelne Aktionen werden keine Array Blöcke genutzt wie hier :


    if(variable == Wert)
    {
    DoSomething();
    }
    else
    {
    DoOtherThings();
    }


    if(variable == Wert)DoSomething();
    else DoOtherThings();


    Oder Zuweisungen ...


    if(variableY == 7)varX =8;


    einfacher geht es so ...


    varX = (variableY == 7) ? (8) : (0);



    Und zum Probleme mit den Maximalen Spielern wie BloodyEric es schon geschrieben hat :


    #undef MAX_PLAYERS
    #define MAX_PLAYERS 32



    Im Grunde ist das optimieren des Codes einfach die Umsetzung in Komplexere Teile sprich man nutzt die die Dynamische Syntax des Codes.

    Mfg. BlackFoX_UD_ alias [BFX]Explosion


  • Hallo


    Vielen vielen Dank, da shat mir sehr geholfen (Vorallem Goldkiller und BFX). Ich kenn mich eben mit PVar nicht aus und habe auch nicht soooo die Lust es zu lernen/anzuschauen ;)


    dUDA


    //Edit
    Als Übergangslösung:
    Wie gross muss der MS-Intervall Unterschied sein, dass sich zB 2 1 Sekunden Timer nicht scheiden ? Muss der grösser als 200MS sein ?