Ebben a leckében leírom nektek, hogyan tudjátok jobban optimalizálni a kódotokat, valamint a forráskódotok értelmezését nehezíteni (tehát még ha sikerül vissza fordítani is, nehezebben lehet megérteni), úgy hogy nem lassítjuk a kódot.
1. lépés: Ciklusok
A ciklusoknak rengetegféle alkalmazási módszerük van.
Nézzük elõször az alap használatot:
[pawn]
for(new i = 0; i < MAX_PLAYERS; i++)[/pawn]
Ha egy jobban tudó scripter ezt jobban átnézi, látja, hogy ez nagyon pazarol. Miért is?
Túl sokat \"gondolkodik\" tõle a processzor. Létre hozza a változót, megnézi a feltételt, utána növeli.
Erre van egy sokkal egyszerûbb alkalmazási módszer. (A következõ módszer Zsolesszka ötlete volt.)
[pawn]new i = 0;
for(; i++ < MAX_PLAYERS;)[/pawn]
Ez a struktúra egyszerûbb, és gyorsabb. Ahogy az elõbb fogalmaztam, itt nem \"gondolkodik\" annyit a processzor, csupán megnézi, hogy az i + 1 kisebb-e mint a ciklusfeltételben a megadott érték. És mivel így alkalmaztuk, még ad is hozzá közben értéket.
A ciklusoknál a másik helyzet a while ciklusnál jön elõ.
Elõször nézzük meg az elõtesztelõs változatát.
[pawn]new i = 0;
while(i < MAX_PLAYERS)
{
//Egy két akció ide
i++;
}[/pawn]
Felesleges pazarlás.
Ugyanúgy mint az elõbb, a ciklusban kell növelnünk az értéket.
[pawn]new i = 0;
while(i++ < MAX_PLAYERS)
{
//Funkciók
}[/pawn]
Régebben leírtam, hogy ezzel el lehet érni az összes játékost, random esetekben gyorsabb, mint a for.
A hátultesztelõs do-while ciklusnál, ugyanígy oldjuk meg, csak a do elõtt hozzuk létre a változónkat.
2. Változók.
Játékos váltózóknál, ha sok van használjunk enumerátort.
Ezt úgy tehetjük meg, hogy az enum utasítást használjuk.
Az enumerátoron belülre rakjuk a változókat, amik kellenek a játékoshoz, és utána létrehozunk egy mátrix-ot, amivel kezelni tudjuk õket. Nyugodtan lehet Float: -ot írni az enumerátoros változók mögé, ugyanúgy mûködnek. (vagy esetleg logikai változóknál bool:)
Példa:
[pawn]enum player_data //enumerátor
{ //változók a blokkon belülre
Float:hp, //lebegõpontos
bool:dead, //logikai
ammo //integer, egész szám
}//az utolsó elé nem kell vesszõ
new pInfo[MAX_PLAYERS][player_data]; //mátrix: két tömbböl álló változó[/pawn]
Másik módszere ennek, a pVar rendszer, avagy a pVar kezelõ függvények.
Ezek a függvények kezelik a játékos változókat. Elsõ beállításnál hozza létre a megadott változót, mikor kilép a játékos a pVar-jai törlõdnek.
Használat:
[pawn]SetPVarFloat(playerid,\"Health\",100.0);
SetPVarInt(playerid,\"Ammo\",50);
SetPVarString(playerid,\"Name\",\"Fade\");[/pawn]
Globális változókhoz ajánlom a GVar plugint (keressetek utána hiv. fórumon), ugyanolyan a használata, mint a PVar-oknak.
Másik módszer pedig ugyanúgy a tömbök használata.
Példáúl definiálsz egy változót mondjuk \"MAX_VARS\" néven, ez fogja tárolni a globális változók számát.
Majd létrehozunk egy tömböt, cellaszámnak a MAX_VARS -ot adjuk meg, tehát 20 cellánk lesz, mindegyik más változó, külön áll egymástól.
[pawn]#define MAX_VARS 20 //Tehát 20 globális változónk lesz
new gVars[MAX_VARS];[/pawn]
Ez részben a forráskód nehezítéshez is tartozik, mivelhogy számokkal fogod kezelni a változókat, és nem névvel, így egy embernek, aki nem ismeri a forráskódodat még, nehezen fogja érteni a dolgokat. A tulajnak is nehéz lesz, de könnyen meg lehet szokni, fõleg ha leírod magadnak kommentbe (mivel a visszafordítás nem írja bele a kommenteket), vagy akárhova máshova is leírhatod, melyik szám melyik változó.
Használatra példa:
[pawn]public OnPlayerSpawn(playerid)
{
gVars[1] = 1; //Ez lesz a \"Spawned\" változó
return 1;
}[/pawn]
Változókról még annyit, hogy ha ciklust használunk, bizonyos változókat ne a ciklusban hozzunk létre, hanem azon kívül.
Ennek a lényege az, hogy ne foglaljon memóriát, és ne is szabadítsa föl sok százszor. <- Ez is lassítja a processzort, valamint megtelítheti a RAM-ot.
3. Értékek nehezítése.
A változók értelmezését is nehezíthetjük. Ezt úgy tehetjük meg, hogy nem sima decimális, egész számokat használunk értékadásra, hanem Hexadecimális számokat.
Ez nem lassít semmit, \"jobban igazítja a géphez a kódodat\", azt is mondják egyesek, hogy az ilyen számokat gyorsabban kezeli a CPU.
Ha egy változónak Hexadecimális számokat akarsz megadni, használd a konvertert.
http://www.binaryhexconverter.com/decimal-to-hex-converterMiután átkonvertáltad a számodat Hexadecimálisra, írd az elejére azt, hogy \"0x\"
Tehát ha 50-et ad ki a konvertáló neked, akkor így néz ki: 0x50
Ez nem változtatja az értéket, viszont még nehezebbé teszi a forráskód olvasását.
Példa:
[pawn]gVars[5] = 0x50;[/pawn]
Mára ennyi lenne, remélem érthetõ, hasznos.