Code Optimierung

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
  • Nein. Wenn man sich die Techniken zur Optimierung anvertraut hat braucht man auch nicht länger als auf die ressourcenfressende Weise.

  • Ja ich meinte damit, wenn man andauernd jede einzelnen Stelle überprüft obs nicht noch irgendwie perfekter geht, dann braucht man ziemlich ewig.
    Wenn man natürlich bereits in lesbarer Form (wie hier) vorhandene Optimierungstechniken vor sich liegen hat, ist das natürlich kaum ein Problem, da muss man einfach nur das geschriebene auch umsetzen. Ich habe auch mal bei meinem RpG Skript festgestellt, dass mein Member-Speicher-Skriptteil zwar effektiv war, allerdings eine ziemlich wichtige Funktion missen ließ und das war das Zugreifen auf Spieler die Offline waren, daraufhin konnte ich jede einzelnen Zeile von den knapp 20k überprüfen und gegebenfalls ändern, falls sie nicht mit dem neuen System kompatibel ist, hat mich ca. 7 Stunden an Arbeit gekostet aber am Ende wars die Sache wert.
    Man muss halt manchmal einfach seinen inneren Schweinehund überwinden, weil man sonst irgendwann an Grenzen stößt wo der Server dann sagt "So, so weit und keine Zeile weiter oder ich brech zusammen" ^^ und spätestens dann ist man gezwungen sein Verhalten zu überdenken, was bei einem vollem Server die Spieler ziemlich stark verärgern wird, wenn sie dann mit Laggs und Bugs zu kämpfen haben, weil das Skript mit einem mal in 1000 Sachen umgeändert wurde und Bugs kaum auffindbar sind...
    Deshalb besser konstant an Effektivität arbeiten, dann hat man nicht irgendwann dieses Problem

  • Nun ja ich hab bis jetzt bei meinem freeroom was ich grade scripte 2070 zeilem meine befehle mit strget oder strok ( weiss net obs richtig ist) ist das gut oder eher ressourcefresser? weil ich hab von dcmd kein plan ^^

  • Jop Tjong, ich hatte bestimmt 300 mal im Script new string, und des zu löschen dauerste ewigs.
    Dann immer new playername etc..
    Ich hatte alles immer definiert.
    Statt 1mal.
    Nun konnte ich übest abspecken von früher 5 MB auf 800 KB :)

    Kalcor: "... it makes the game look like it's not GTA. This mod is called San Andreas Multiplayer. It's not a custom game engine which you can script..."

  • Nun ja ich hab bis jetzt bei meinem freeroom was ich grade scripte 2070 zeilem meine befehle mit strget oder strok ( weiss net obs richtig ist) ist das gut oder eher ressourcefresser? weil ich hab von dcmd kein plan ^^


    Ist defintiv ein Ressourcenfresser, solange du allein oder mit 5 Mann aufm Server bist wird das wohl kaum ins Gewicht fallen, aber wenns dann 30 Leute oder noch mehr sind und auf einem nicht all zu starkem root sind dann sind Lags schon vorprogrammiert...


    Tobias:
    Jo siehste doch, ist halt ne Arbeit aber am Ende ist man dann auch stolz, was man jetzt geschafft hat :D

  • Da ich kein Script dass viel Leistung frisst, und auch keinen Server der sehr hardwarestark ist, habe, kann ich das nicht beurteilen.
    Ich vermute aber mal dass es trotzdem sehr dumm ist wenn man seinen Server so belastet.

  • Eben weil höhere Leistung -> Kostet mehr und ist schädlich für die Umwelt oder so...
    Und wie bereits gesagt, ist es ja nicht schwer wenn mans schon vorgekaut bekommt und es nur noch einbinden muss

  • Ich sehe oft sowas:


    new string[128],name[MAX_PLAYER_NAME];
    GetPlayerName(playerid,name,sizeof(name));
    format(string,sizeof(string),"%s (%d) hat den Server betreten!",name,playerid);
    SendClientMessageToAll(0xFF0000FF,string);


    Sparen wir uns "name"!



    new string[128];
    GetPlayerName(playerid,string,sizeof(string));
    format(string,sizeof(string),"%s (%d) hat den Server betreten!",string,playerid);
    SendClientMessageToAll(0xFF0000FF,string);

  • if(!tmp[0])return SendClientMessage(playerid,farbe,"nachricht");


    Genau genommen ist es schlecht, wenn man professioneller Programierer ist. Du weißt nicht, das SendClientMessega für einen Wert wieder gibt.
    Stell dir vor, die würden beim nächsten Update schönheitshalber den Wert auf 0 setzen.

  • Doch das weiß ich, der Fall das diese Funktion 0 wiedergibt liegt bei mindestens,
    ich bin mir da aber zu 100% sicher das dieser Fall nie eintreten wird, das wäre somit genau
    so Effektiv wie wenn ich die Abfrage im Kommando weglasse ob der Spieler verbunden ist.

    Mfg. BlackFoX_UD_ alias [BFX]Explosion


  • Da hast du Recht.


    Ich bin mir nicht mehr genau sicher, wie die Begründung dafür war.
    Aber ich habe es auch immer so gemacht und da meinte Y_Less (bin mir nicht mehr ganz sicher), dass es so unschön wäre, obwohl es ja kürzer sei.





    Edit:
    Eine weitere wichtige Funktion für das Optimieren des Codes ist die neue pVar Funktion des R5 - Releases (Zitat):
    _____________________________________________________________________________________


    Per-player variable system: (PVars)


    Originally SA-MP was only designed for 100 maximum players. This meant defining arrays in pawn of MAX_PLAYERS size such as: PlayerInfo[MAX_PLAYERS] was generally okay. Now that MAX_PLAYERS is defined as 500, script writers are finding themselves creating arrays with 500 elements just to store a single flag. This can turn out to be very wasteful in terms of memory use. These variables also need to be manually reset when the player using them leaves the server.


    Advantages of using PVars over arrays of MAX_PLAYERS:
    1) PVars can be shared/accessed across gamemode scripts and filterscripts, making it easier to modularise your code.
    2) PVars are automatically deleted when a player leaves the server, meaning you don't have to manually reset variables for the next player who joins.
    3) No real need for complex enums/player info structures.
    4) Saves memory by not allocating pawn array elements for playerids which will probably never be used.
    5) You can easily enumerate and print/store the PVar list. This makes both debugging and player info storage easier.
    6) Even if a PVar hasn't been created, it still will return a default value of 0.
    7) PVars can hold very large strings using dynamically allocated memory.



    // Per-player variable system (PVars)
    native SetPVarInt(playerid, varname[], int_value);
    native GetPVarInt(playerid, varname[]);
    native SetPVarString(playerid, varname[], string_value[]);
    native GetPVarString(playerid, varname[], string_return[], len);
    native SetPVarFloat(playerid, varname[], Float:float_value);
    native Float:GetPVarFloat(playerid, varname[]);
    native DeletePVar(playerid, varname[]);


    // PVar enumeration
    #define PLAYER_VARTYPE_NONE 0
    #define PLAYER_VARTYPE_INT 1
    #define PLAYER_VARTYPE_STRING 2
    #define PLAYER_VARTYPE_FLOAT 3


    native GetPVarsUpperIndex(playerid);
    native GetPVarNameAtIndex(playerid, index, ret_varname[], ret_len);
    native GetPVarType(playerid, varname[]);

    _____________________________________________________________________________________

  • Was mich schon länger interessiert :
    Ist es sinnvoller ein enum mit den ganzen Spielervariablen zu erstellen oder doch lieber die neueren PVars ?


    Nicht jeder, der sich für super hält, ist ein Superheld. :love:
    ------------------------------------------------------------------------------------------------

  • Hallo habe mich jetzt die letzen drei tage verscuht hier durchzuwurschteln. Jetzt bin ich über eine Sache extrem gestoppelrt. Das ist mein Speedo. könnt ihr mir helfen meinen jetzt ziehmlich recurcen fressenden Tacho auf einen Sparsarmen Taco hienunter zu zwingen?


    Tach Code:
    public CheckSpeed(playerid)
    {
    new vehid = GetPlayerVehicleID(playerid);
    new Float:speed_x, Float:speed_y, Float:speed_z, Float:FSpeed;
    new final_speed_int;
    new string[256];
    if(vehid != 0)
    {
    GetVehicleVelocity(vehid, speed_x, speed_y, speed_z);
    FSpeed = floatsqroot(((speed_x * speed_x) + (speed_y * speed_y)) +(speed_z * speed_z)) * 136.6666666666666666667; //KM/H
    final_speed_int = floatround(FSpeed, floatround_round);
    format(string, 256,"~r~Speed: ~w~%i ~g~km/h", final_speed_int);
    TextDrawSetString(Speedo[playerid], string);
    if(gGas[playerid] == 1)
    {
    Fuel[playerid] = TextDrawCreate(250.00, 411.00, " Treibstoff ");
    TextDrawLetterSize(Fuel[playerid],1.0,1.8);
    TextDrawColor(Fuel[playerid], 0x00FFFFFF);
    TextDrawUseBox(Fuel[playerid], 1);
    TextDrawTextSize(Fuel[playerid], Gas[vehid]+250, 414.00);
    TextDrawBoxColor(Fuel[playerid], 0x0000FF48);
    TextDrawSetOutline(Fuel[playerid], 4);
    TextDrawShowForPlayer(playerid, Fuel[playerid]);
    gGas[playerid] = 0;
    }
    SetTimerEx("CheckSpeed",100,false,"i",playerid);
    }
    else
    {
    TextDrawSetString(Speedo[playerid], " ");
    TextDrawDestroy(Fuel[playerid]);
    }
    }



    Veilen Dank für eure hilfe!

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