Resourcen gegen CPU Leistung tauschen (keine Passenderere Überschrift eingefallen)

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, man kennt es wahrscheinlich... Manche Variablen, die nicht wirklich oft verwendet werden, aber dennoch... Ich sage es mal so: Viele Variablen brauchen
    Nehmen wir als Beispiel mal
    new abgeschlossen[MAX_VEHICLES];
    Das sind 2000 Variablen, die dort benötigt werden, dabei wird in jede nur eine 1 oder eine 0 geschrieben, ist doch ein wenig Verschwendung oder?
    new abgeschlossen[67];
    Sieht doch schon besser aus, oder?
    Dazu dienen 4 Funktionen... bekanntlich ist pawn ja eine 32 Bit Software, damit liegt die Maximale Integerwertgröße bei 2147483647 (und bei -2147483648), warum also den Rest ungebraucht lassen?
    Hier sind erstmal du Funktionen, Erklärung und Beispiel steht weiter unten
    stock GetMehrfach(var,d) {
    new x[30], h[]= { 1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,536870912 }, i=29;
    for(; i>=0; i--) if(var>=h[i]) { var-=h[i]; x[i]++; }
    if(!d) for(i=0; i<30; i++) { if(!x[i]) return i; }
    else { for(i=29; i>=0; i--) { if(!x[i]) return i; }}
    return -1;
    }
    stock AddMehrfach(var,a) {
    if(a<=29) {
    new h[]= { 1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,536870912 };
    return var+h[a]; }
    return var;
    }
    stock RemoveMehrfach(var,a) {
    if(a<=29) {
    new h[]= { 1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,536870912 };
    return var-h[a]; }
    return var;
    }
    stock VonMehrfach(var,a) {
    if(a<=29) {
    new h[]= { 1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,536870912 };
    return (var/h[a])%2; }
    return -1;
    }
    Erklärung und Anwendung:


    Wir fangen mal an mit AddMehrfach(variable,wert);
    Man hat jetzt z.B. wieder seine Autos, die man abschließen möchte, dazu haben wir ja unseren Variable "new abgeschlossen[67];"
    Wenn man jetzt die Autoid 0 abschließt könnte man es so machen:
    abgeschlossen[0]=AddMehrfach(abgeschlossen[0],0);//erklärung folgt später
    //für autoid 1 dementsprechend:
    abgeschlossen[0]=AddMehrfach(abgeschlossen[0],1);//bis 29
    Es wird der Wert der Variable + der wertigkeit der entsprechenden Position zurückgegeben
    Sollte es eine inkorrekte Eingabe sein, wird eine unveränderte Varaible zurückgegeben
    Dies alles einzelnd zu machen ist ein wenig umständlich, mehr dazu aber später


    RemoveMehrfach(variable,wert);
    Ist das gleiche wie AddMehrfach, halt nur umgekehrt
    Wenn jetzt ein Auto aufgeschlossen wird, wird der Wert einfach wieder abgezogen
    abgeschlossen[0]=RemoveMehrfach(abgeschlossen[0],0);//autoid 0
    //für autoid 1 dementsprechend:
    abgeschlossen[0]=RemoveMehrfach(abgeschlossen[0],1);//bis 29
    Sollte es eine inkorrekte Eingabe sein, wird eine unveränderte Varaible zurückgegeben


    VonMehrfach(variable,position);
    Mit dieser Funktion lässt sich überprüfen, ob in einer Variable an n-ter Stelle (0<=n<=29)
    Beispiel:
    new a=VonMehrfach(abgeschlossen[0],0);//wenn der wert aus position 1 eine 1 ist, wird eine 1 zurückgegeben, sonst eine 0
    Was für unser Beispiel jetzt heißt: Ist a eine 1, ist das Auto abgeschlossen
    Sollte es eine inkorrekte Eingabe sein, wird eine -1 zurückgegeben


    Dann gibt es noch die Funktion GetMehrfach(variable,kleingroß);
    Dies überprüft halt, an welcher Position die erste 0 steht (von vorne oder hinten) und gibt die Position zurück
    Wir haben jetzt z.b.:
    abgeschlossen[0]=AddMehrfach(abgeschlossen[0],0);//position 0
    abgeschlossen[0]=AddMehrfach(abgeschlossen[0],1);//position 1
    abgeschlossen[0]=AddMehrfach(abgeschlossen[0],2);//position 2
    So wäre ja an Position 3 unsere nächste 0, daher:
    new a=GetMehrfach(abgeschlossen[0],0);
    Die 0 als zweiter Parameter bestimmt, ob der kleinste oder größte Wert zurückgegeben werden soll, bei einer 0 wird der kleinste Wert zurückgegeben, was in diesem Falle eine 3 wäre, bei etwas anderem als einer 0 der größte, was in diesem Falle die 29 wäre
    Bei Inkorrekter Eingabe wird auch hier eine -1 zurückgegeben


    Zur Anwendung:
    Dies andauernd mit abgeschlossen[0] und so ist ja sehr umständlich, daher kann mans auch errechnen lassen:
    new a=vehicleid/30;
    abgeschlossen[a]=AddMehrfach(abgeschlossen[a],vehicleid%30);
    Wir haben als Beispiel die vehicleid 199...
    199/30=6
    199%30=19
    Man rechnet zusammen: 6*30+19=199, stimmt also


    Nun ein Anwendungsbeispiel beim abschließen von Türen bei Autos:
    //ganz nach oben:
    new abgeschlossen[67];
    //OnPlayerCommandText:
    if(strcmp(cmdtext,"/abschließen",true)==0) {
    if(IsPlayerInAnyVehicle(playerid)) {
    new aid=GetPlayerVehicleID(playerid), a=aid/30, b=aid%30;
    if(!VonMehrfach(abgeschlossen[a],b)) {
    abgeschlossen[a]=AddMehrfach(abgeschlossen[a],b);
    //jetzt ist es halt abgeschlossen
    }}
    return 1;
    }
    if(strcmp(cmdtext,"/aufschließen",true)==0) {
    if(IsPlayerInAnyVehicle(playerid)) {
    new aid=GetPlayerVehicleID(playerid), a=aid/30, b=aid%30;
    if(VonMehrfach(abgeschlossen[a],b)==1) {
    abgeschlossen[a]=RemoveMehrfach(abgeschlossen[a],b);
    //jetzt ist es halt aufgeschlossen
    }}
    return 1;
    }
    //OnPlayerEnterVehicle:
    if(VonMehrfach(abgeschlossen[vehicleid/30],vehicleid%30)==1) {
    SendClientMessage(playerid,FARBE,"Die Türen dieses Fahrzeuges sind abgeschlossen");
    TogglePlayerControllable(playerid,0);
    TogglePlayerControllable(playerid,1);
    return 0;
    }


    Ich weiß genau, dass ich hier jetzt noch was schreiben wollte, habs aber im Laufe der Zeit vergessen^^
    Editier ich, wenns mir wieder einfällt... soferns mir wieder einfällt^^

  • auch das anpassen von define max_players auf die slots-anzahl spart einiges an ram


    wenn man dann noch alle string[256] auf die wahre länge anpasst, drückt man den ram nochmal übelst


    sa-reallife läuft momentan mit ~30-35mb ram bei 100 playern :P

  • Sieht ganz Nett aus aber sowas


    if(!VonMehrfach(abgeschlossen[a],b)){


    }


    kann man auch abkürzen mit einer Direkten Anweisung den Code zu beenden sprich eine Rückgabe, oder sowas
    if(a<=29) {
    new h[]= {...};
    return var-h[a]; }
    return var;


    zu
    return (a<=29) ? (var-h[a]) : (var);

    Mfg. BlackFoX_UD_ alias [BFX]Explosion


  • return (a<=29) ? (var-h[a]) : (var);


    bringt es in dem Fall nicht wirklich weil du innerhalb Triadischer Operatoren nicht mit der
    Zuweisung Bitwerten arbeiten kannst.


    new h[]= {...};


    Soweit ich weiß (~bin mir nicht sicher habs nicht getestet) kann man erst gar nicht erst mit Triadischen Op.
    und Tabellen arbeiten.


    new h[] = (a<=29) ? ({1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,536870912}) : ("\0");

    [align=center]
    Mta Script Editor - Work in Progress

  • Hab ich doch eben gesagt^
    Man bräuchte wieder ne extra Abfrage für die Bytes Zuweisung,
    was den Code nicht kürzer macht


    Zitat

    Soweit ich weiß (~bin mir nicht sicher habs nicht getestet) kann man erst gar nicht erst mit Triadischen Op.
    und Tabellen arbeiten.

    [align=center]
    Mta Script Editor - Work in Progress

  • Hab ich doch tatsächlich vergessen Gestern hier noch zu posten.


    enum (<<= 1)
    {
    PLAYER_FLAG_GOD = 1,
    PLAYER_FLAG_VIP, // 2
    PLAYER_FLAG_MUTE, // 4
    PLAYER_FLAG_INVISIBLE, // 8
    PLAYER_FLAG_SPECTATED, // 16
    PLAYER_FLAG_SPEEDO, // ...
    PLAYER_FLAG_LOGGEDIN,
    PLAYER_FLAG_LOGINCHECK,
    PLAYER_FLAG_JAIL,
    PLAYER_FLAG_REGISTERMSG,
    PLAYER_FLAG_VTEXT,
    PLAYER_FLAG_DRAWAVAILABLE,
    PLAYER_FLAG_FREEZE,
    PLAYER_FLAG_LOGINPANEL
    };
    // defined um es einfacher zu gestalten :-O
    #define IsPlayerFlag(%0,%1) \
    (PlayerInfo[%0][ibFlag] & (%1) )


    #define AddPlayerFlag(%0,%1) \
    (PlayerInfo[%0][ibFlag] |= %1 )


    #define DeletePlayerFlag(%0,%1) \
    (PlayerInfo[%0][ibFlag] &= ~%1 )


    #define ResetPlayerFlag(%0) \
    (PlayerInfo[%0][ibFlag] = 0)
    // AddPlayerFlag(playerid,PLAYER_FLAG_MUTE); bsp


    Sowas kann man bei vielen Sachen benutzen.
    Ein gutes Beispiel wäre wohl ein Führerschein in einem Reallife-Script.
    Anstatt sowas zu benutzten:
    bool:HATAUTOFUEHRERSCHEIN[MAX_PLAYERS];
    bool:HATMOTORRADFUEHRERSCHEIN[MAX_PLAYERS];
    ...

    Kann man es anders regeln wie oben gezeigt.
    enum (<<= 1)
    {
    LAPPEN_AUTO = 1,
    LAPPEN_MOTORRAD,
    LAPPEN_BOOT,
    LAPPEN_FLUGZEUG
    };
    new ibFuehrerschein[MAX_PLAYERS];

    Man müsste dann nur Abfragen ob das Bit gesetzt ist für einen bestimmten Führerschein.
    if(ibFuehrerscehin[playerid] & LAPPEN_AUTO) { }
    Spart einiges an Arbeit.Hab es selber auch so gemacht in einem angefangen Reallife-Script :pinch: .


    Passt zwar nicht ganz hier in den Thread aber was solls :-O