Script Beurteilung ob es Ressourcenschonend ist....

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 Breadfish,
    ich war den ganzen Tag an meinem Selfmade Script gehockt, und habe es
    Ressourcenschonend gemacht, wo es ging. Habe mir Tutorials/Code Optimierung angeguckt
    und mich gleich an mein Script gewackt, bevor es noch mehr Zeilen bekommt und ich 1 Monat daran hocke.
    Hatte beim Serverstart ca 250ms mittlerweile habe ich nur noch im Durschnitt 6ms.


    Mir wäre es dennoch recht wenn Profis mal drüber schauen könnten und mir vllt noch Scripttipps geben können.
    Scripten kann ich ja aber eben Ressourcenfressend. Dies möchte ich ablegen.


    Spriptzeilen 1914 !

    Pastebin


    Vielen dank für die hilfe


    /e Script und Pastebin Aktualisiert (30.07 19:51)
    /e Rechtschreibfehler ausgebessert

  • Ich habe keine Lust mir ~2000 Zeilen mal so einfach anzuschauen xD


    Aber mal ein Tipp für for-Schleifen:

    Spoiler anzeigen
    case KEY_SECONDARY_ATTACK:
    {
    new i = 0;
    for(;i < MAX_EINGANG; i++)
    {
    new string[16];
    if(GetPVarInt(playerid,"InRoom") == 999)
    {
    if(PlayerToEingang(4.0, playerid, i,0))
    {
    format(string, sizeof(string), "~y~%s", EingangInfo[i][eName]);
    GameTextForPlayer(playerid, string, 5000, 3);
    SetPlayerPos(playerid, EingangInfo[i][eX2],EingangInfo[i][eY2],EingangInfo[i][eZ2]);
    SetPlayerInterior(playerid, EingangInfo[i][eInt]);
    SetPlayerVirtualWorld(playerid, EingangInfo[i][eVW]);
    SetPVarInt(playerid,"InRoom", i);
    }
    }
    else if(GetPVarInt(playerid,"InRoom") != 999)
    {
    if(PlayerToEingang(4.0, playerid, i,1))
    {
    SetPlayerPos(playerid, EingangInfo[i][eX],EingangInfo[i][eY],EingangInfo[i][eZ]);
    SetPlayerInterior(playerid, 0);
    SetPlayerVirtualWorld(playerid, 0);
    SetPVarInt(playerid,"InRoom", 999);
    }
    }
    }
    }


    Wenn du in der Schleife in den Raum gesetzt wirst, bzw. die Schleifen seinen Zweck erfüllt hat, solltest du sie mit break; beenden.


    Wenn du zB für den eine Schleife über alle Spieler machst, um zum Beispiel einen bestimmten Spieler zu finden, der dann am Ende
    die playerid 5 hat, muss er ja nicht unnötig nochmal den Code 495x durchgehen.


    Also zB dann:

    for(new i=0; i<MAX_PLAYERS; i++)
    {
    new bool:istEinAdminOn=false;
    if(IsPlayerAdmin(playerid)){
    istEinAdminOn = true;
    break;
    }
    if(istEinAdminOn==true) return SendClientMessage(playerid,-1,"Ja, es ist mindestens 1 Admin online!");
    else return SendClientMessage(playerid,-1,"Es ist kein Admin online!");
    }


  • Würde die Textdraws in einem Array speichern, z.b new Text: Textdraws[5];

  • Vielen dank für hilfreiche Antworten, habe diese sofort umgesetzt und bei anderen möglichen Scriptabschnitte eingefügt.


    @Sh13
    Wie du siehst steht MAX_EINGANG auf 1 also geht er nur 1x durch.
    Das wird ja angepasst wieviele Eingänge ich habe.
    Genauso wie bei den Spielern, ich benutze nicht MAX_PLAYERS,
    sonder PlayerOnServer, ich benutze das um die for schleife auch nur wirklich so oft laufen zu lassen wieviele Spieler auch auf dem Server sind.

  • Wenn jemand konstruktive Tipps fürs Scripten haben will, bin ich gerne bereit zu helfen :)
    Ich werde auf ein paar Kleinigkeiten eingehen und meine Meinung/Erfahrungen zu den jeweiligen Details äußern.



    Verbesserung 1:
    new i = 0;
    for(;i < MAX_VEHICLES; i++)
    { // ...Es ist grundsätzlich sinnvoller, die i-Variable direkt in der for-Schleife zu erstellen, weil sie dann nach der for-Schleife sofort wieder "gelöscht" wird, also der Speicher wird freigegeben. Abgesehen davon muss man in Pawn Variablen nicht mit 0 initialisieren, weil alle Variablen bei der Erstellung automatisch auf 0 gesetzt werden.



    Verbesserung 2:
    if(SpielerInfo[i][pPayDayT] != 3600)
    {
    SpielerInfo[i][pPayDayT] ++;
    }
    else { PayDay(i); }Normalerweise ist es nicht wirklich notwendig, jede Sekunde die Payday-Zeit eine Sekunde herabzusetzen. Das würde auch einmal pro Minute reichen, schließlich kommt es ja nicht auf eine Sekunde mehr oder weniger an. Jede Sekunde alle Spieler durchzugehen und den Payday upzudaten ist jedenfalls relativ unnötig.



    Verbesserung 3:
    if(PlayerToPoint(1.0,playerid, 362.0060,173.4622,1008.3828) //...Die PlayerToPoint-Funktion ist schon seit laaanger Zeit veraltet und sollte durch IsPlayerInRangeOfPoint ersetzt werden.



    Verbesserung 4:
    for(;i < MAX_PLAYERS; i++)MAX_PLAYERS ist im Normalfall 500. Das bedeutet: ganz egal wie viele Spieler auf deinem Server sind, diese Schleife läuft 500 Mal durch. Ganz logisch ist, dass das unnötig ist und zu unnötiger CPU-Last führt. Eine Abhilfe ist, dass du die Konstante MAX_PLAYERS selbst definierst (wenn du nicht mehr als 50 Spieler erwartest, setzt du es z.B. auf 50). Wie das geht, findest du HIER ganz einfach erklärt.
    Wenn du das machst, laufen diese MAX_PLAYERS-Schleifen nur mehr 50 Mal statt 500 Mal durch. Das ist schonmal eine Verbesserung, aber wenn du 10 Spieler am Server hast, ist es immer noch 40 Mal zu viel. Die Lösung ist daher: foreach() benutzen. Das ist eine Schleife, die wirklich nur für die Spieler durchläuft, die gerade online sind. Die Include und eine ganz einfache Erklärung dafür findest du HIER



    Verbesserung 5:
    #define DIALOG_REGISTER 1
    #define DIALOG_LOGIN 2
    #define DIALOG_LOGINDRAWS 3
    #define DIALOG_SH 4
    #define DIALOG_SH0 5
    #define DIALOG_SHNAVI 6
    #define DIALOG_JOB 7Kein Performance-Problem, aber es verstärkt die Komplexität des Scriptens. Wenn du einen Dialog nachträglich zwischen zwei bereits erstellte Dialog-IDs setzen willst, musst du alle nachfolgenden IDs verändern etc. Einfacher ist es, wenn man statt lauter #defines die enum-Funktion verwendet. Dann brauchst du dir auch um die IDs keine Sorgen mehr machen. Der selbe Code wie deiner mit Hilfe eines enums: enum {
    DIALOG_REGISTER,
    DIALOG_LOGIN,
    DIALOG_LOGINDRAWS,
    DIALOG_SH
    DIALOG_SH0
    DIALOG_SHNAVI
    DIALOG_JOB
    }Wenn du jetzt irgendeine ID verändern willst, kannst du den DIALOG_XYZ einfach dazwischen setzen, das enum regelt alles weitere.



    Das wars von meiner Seite, genauer habe ich mich nicht mit dem Code beschäftigt.
    Ich hoffe ich konnte dir ein paar potenzielle Verbesserungen zeigen und dir ein bisschen weiterhelfen :)
    Edit: Rechtschreib- und Code-Fehler


    Liebe Grüße, FlasH

    Professioneller Webentwickler.

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Wie du siehst steht MAX_EINGANG auf 1 also geht er nur 1x durch.
    Das wird ja angepasst wieviele Eingänge ich habe.
    Genauso wie bei den Spielern, ich benutze nicht MAX_PLAYERS,
    sonder PlayerOnServer, ich benutze das um die for schleife auch nur wirklich so oft laufen zu lassen wieviele Spieler auch auf dem Server sind.

    Ich meine nur mal so generell. MAX_EINGANG wird ja auch sicher nicht immer bei 1 bleiben. Wenn das Script mal fertig werden sollte sind es sicher so mindestens 50-100 Stück.

  • Le FlasH
    Danke für deine Verbesserungen und Erklärungen.
    Zu Verbesserung 4 wie schon zu Sh13 gesagt.

    Zitat

    Ich benutze nicht MAX_PLAYERS,
    sonder PlayerOnServer, ich benutze das um die for schleife auch nur wirklich so oft laufen zu lassen wieviele Spieler auch auf dem Server sind.


    @Andrzejxy'
    Verstehe ich nicht ganz


    @Sh13
    Habe das ja nur gesagt, weil du ja geschrieben hattest 495x weitere durchläufe, deswegen.
    Aber danke für die Information, das mit dem break; wusste ich nicht

  • 60, //"Landstalker",
    60,//"Bravura",
    60,//"Buffalo",
    60,//"Linerunner",
    100,//"Pereniel",
    100,//"Sentinel",
    100,//"Dumper",
    100,//"Firetruck",


    Wie du siehst habe ich die Fahrzeug namen hinten dran, deswegen sind die untereinander gereit, damit ich später eventuell
    bei einem Fahrzeug das Ändern kann ohne zu zählen !!

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