Szerző Téma: [Leírás] Kód optimalizáció/Forráskód értelmezésének nehezítése  (Megtekintve 2622 alkalommal)

GroX

  • Vendég
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-converter
Miutá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.
« Utoljára szerkesztve: 2011. Október 07. - 17:22:50 írta 0xC01DFACE »

Nem elérhető instant

  • 2778
  • ZzzzzZ
    • Profil megtekintése
[Leírás] Kód optimalizáció/Forráskód értelmezésének nehezítése
« Válasz #1 Dátum: 2011. Augusztus 03. - 15:25:34 »
0
segitség forumba irtad a témát ;D
am jo lett :D

GroX

  • Vendég
[Leírás] Kód optimalizáció/Forráskód értelmezésének nehezítése
« Válasz #2 Dátum: 2011. Augusztus 03. - 15:27:55 »
0
Tényleg, basszus... Valaki helyezze át legyen szíves.

[Leírás] Kód optimalizáció/Forráskód értelmezésének nehezítése
« Válasz #3 Dátum: 2011. Augusztus 03. - 16:03:45 »
0
Nem rossz leírás de ez a rész nem teljesen igaz:
[pawn]
new i = 0;
for(; i++ < MAX_PLAYERS;)
[/pawn]
Ez a rész hogy a megfelelõ index értékek között fusson le  (0 -tól 499-ig) ahhoz kell egy kis trükk persze a postfix (i++;) és prefix-es (++i;) alak már megint fabatkát se ér pawnban pont ennél, de van rá példa hogy számít.
Akkor mûködik megfelelõen ha így alkalmazzuk:
[pawn]
new i = -1;
for(; i++ < MAX_PLAYERS - 1;)
{
   printf(\"i: %d\", i);
}
[/pawn]
És a while is tud meglepetést okozni itt egy pár példa ami helyesen kerül végrehajtásra:
[pawn]
new test1 = -1;
while(test1++ < MAX_PLAYERS - 1)
{
   printf(\"test1: %d\", test1);
}
print(\" \");
//-------
new test2 = 0;
while(test2 < MAX_PLAYERS)
{
   printf(\"test2: %d\", test2++); // Egy utasításban növelve az értékét postfixes alakban
}
print(\" \");
//------
new test3 = -1;
while(++test3 < MAX_PLAYERS)// Prefixes alakban.
{
   printf(\"test3: %d\", test3);
}
[/pawn]
Az én javaslatom az hogy bármelyik formát akarjuk használni mindig legyen egy tesztelés (printf), hogy lássuk számunkra megfelelõ értékekkel fut-e végig a ciklus folyamatunk.
És itt van még két apróság prefix és postfix közötti különbség:
[pawn]
new
   test1 = 0;
while(test1 < MAX_PLAYERS)
{
   printf(\"Alap érték: %d\", test1);
   printf(\"test2: %d\", test1++); //Postfix
   printf(\"postfix: %d | az elõzõ funkcióba növeltük a változónk értékét postfixes alakban.\", test1);
   print(\" \");
}
[/pawn]
[pawn]
new
   test2 = -1;
while(test2 < MAX_PLAYERS - 1)
{
   printf(\"Alap érték: %d\", test2);
   printf(\"test2: %d\", ++test2); // Prefix
   printf(\"prefix: %d | az elõzõ funkcióba növeltük a változónk értékét prefixes alakban.\", test2);
   print(\" \");
}
[/pawn]
A lényeg hogy elég becsapósak tudnak lenni ezek a ciklus utasítások, ezért mindig le kell ellenõrizni õket fõleg ha valami komplikáltabb dologgal foglalkozunk.
Ha nem tesszük akkor jön a következõ hiba üzenet \"Array index out of bounds\".  :D
« Utoljára szerkesztve: 2011. Augusztus 03. - 16:21:42 írta Zsolesszka »

Nem elérhető kurta999

  • 2759
  • Éllő fédisznó
    • Profil megtekintése
[Leírás] Kód optimalizáció/Forráskód értelmezésének nehezítése
« Válasz #4 Dátum: 2011. Augusztus 05. - 19:25:52 »
0
Szép leírás.
Amúgy hozzátenném, én a mostanában nem ajánlom a PVar-t se, meg a GVar-t se.
Igaz, hogy mindegyik dinamikus memóriát fogal, csakhogy lassúak. Bár errõl itt olvashattok.
Egyszerûbb a rendes változó használata, bár igaz, néhány helyen pont erre van szükségünk.
A hexadecimális számokat, meg arra használják, hogy ovlashatatlanabb legyen, hanem hogy olvashatóbb xD
Pl a 65535 az jobban néz ki így: FFFF
vagy a 255: FF

GroX

  • Vendég
[Leírás] Kód optimalizáció/Forráskód értelmezésének nehezítése
« Válasz #5 Dátum: 2011. Augusztus 05. - 23:37:03 »
0
Idézetet írta: kurta999 date=1312565152\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"10145\" data-ipsquote-contentclass=\"forums_Topic
Szép leírás.
Amúgy hozzátenném, én a mostanában nem ajánlom a PVar-t se, meg a GVar-t se.
Igaz, hogy mindegyik dinamikus memóriát fogal, csakhogy lassúak. Bár errõl itt olvashattok.
Egyszerûbb a rendes változó használata, bár igaz, néhány helyen pont erre van szükségünk.
A hexadecimális számokat, meg arra használják, hogy ovlashatatlanabb legyen, hanem hogy olvashatóbb xD
Pl a 65535 az jobban néz ki így: FFFF
vagy a 255: FF
 
Igen, csak tudod a hexadecimális számokat nem egyszerû megtanulni, meg aki nem programozó fejjel gondolkodik, annak egyszerûbb a sima szám.

Nem elérhető krisk

  • 2380
    • Profil megtekintése
[Leírás] Kód optimalizáció/Forráskód értelmezésének nehezítése
« Válasz #6 Dátum: 2011. Augusztus 06. - 10:14:12 »
0
Idézetet írta: Fade シ date=1312580223\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"10145\" data-ipsquote-contentclass=\"forums_Topic


Szép leírás.
Amúgy hozzátenném, én a mostanában nem ajánlom a PVar-t se, meg a GVar-t se.
Igaz, hogy mindegyik dinamikus memóriát fogal, csakhogy lassúak. Bár errõl itt olvashattok.
Egyszerûbb a rendes változó használata, bár igaz, néhány helyen pont erre van szükségünk.
A hexadecimális számokat, meg arra használják, hogy ovlashatatlanabb legyen, hanem hogy olvashatóbb xD
Pl a 65535 az jobban néz ki így: FFFF
vagy a 255: FF
 
Igen, csak tudod a hexadecimális számokat nem egyszerû megtanulni, meg aki nem programozó fejjel gondolkodik, annak egyszerûbb a sima szám.
 
[/quote]
Ezzel szembe szálnék, teszem azt, a leggyakoribb használata a hexadecimális számoknak az RGB kódok. Szerintem az \"#RRGGBBTT\" szintaxisban sokkal barátabb, mint ha beírnánk egy tizes számrendszerbeli számot. Kinyomtatsz egy átváltási ill. szorzási táblázatot, és le is van a gond róla 255-ig.
« Utoljára szerkesztve: 2011. Augusztus 06. - 10:21:26 írta krisk »

GroX

  • Vendég
[Leírás] Kód optimalizáció/Forráskód értelmezésének nehezítése
« Válasz #7 Dátum: 2011. Augusztus 21. - 10:46:57 »
0
Utólag rájöttem, hogy a ciklusok részlegnél a \"for\"-nál ez a rész:
[pawn]for(; i++ < MAX_PLAYERS;)[/pawn]
Felesleges, mert a fordító ugyanúgy kezeli a teljes változatát, mint ezt.

[Leírás] Kód optimalizáció/Forráskód értelmezésének nehezítése
« Válasz #8 Dátum: 2011. Augusztus 21. - 14:40:43 »
0
Idézetet írta: Fade シ date=1313916417\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"10145\" data-ipsquote-contentclass=\"forums_Topic
Utólag rájöttem, hogy a ciklusok részlegnél a \"for\"-nál ez a rész:
[pawn]for(; i++ < MAX_PLAYERS;)[/pawn]
Felesleges, mert a fordító ugyanúgy kezeli a teljes változatát, mint ezt.
 
Nem nem kezeli úgy, ott vannak a print és printf funkciók amikkel igenis tessék ellenõrizni.
Én megtettem írtam egy rövid tesztet:
[pawn]   new
   index = 0;
for(; index++ < 10; )
   printf(\"%d\", index);
print(\" \");
for(new index2 = 0; index2 < 10; index2++)
   printf(\"%d\", index2);
[/pawn]
ezt az eredményt kaptam:
 
[2011.08.21 14:35:34] 1
[2011.08.21 14:35:34] 2
[2011.08.21 14:35:34] 3
[2011.08.21 14:35:34] 4
[2011.08.21 14:35:34] 5
[2011.08.21 14:35:34] 6
[2011.08.21 14:35:34] 7
[2011.08.21 14:35:34] 8
[2011.08.21 14:35:34] 9
[2011.08.21 14:35:34] 10
[2011.08.21 14:35:34] 
[2011.08.21 14:35:34] 0
[2011.08.21 14:35:34] 1
[2011.08.21 14:35:34] 2
[2011.08.21 14:35:34] 3
[2011.08.21 14:35:34] 4
[2011.08.21 14:35:34] 5
[2011.08.21 14:35:34] 6
[2011.08.21 14:35:34] 7
[2011.08.21 14:35:34] 8
[2011.08.21 14:35:34] 9
[/quote]
Akkor ez alapján még se ugyanaz.

GroX

  • Vendég
[Leírás] Kód optimalizáció/Forráskód értelmezésének nehezítése
« Válasz #9 Dátum: 2011. Augusztus 21. - 16:05:08 »
0
Idézetet írta: Zsolesszka date=1313930443\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"10145\" data-ipsquote-contentclass=\"forums_Topic


Utólag rájöttem, hogy a ciklusok részlegnél a \"for\"-nál ez a rész:
[pawn]for(; i++ < MAX_PLAYERS;)[/pawn]
Felesleges, mert a fordító ugyanúgy kezeli a teljes változatát, mint ezt.
 
Nem nem kezeli úgy, ott vannak a print és printf funkciók amikkel igenis tessék ellenõrizni.
Én megtettem írtam egy rövid tesztet:
[pawn]   new
   index = 0;
for(; index++ < 10; )
   printf(\"%d\", index);
print(\" \");
for(new index2 = 0; index2 < 10; index2++)
   printf(\"%d\", index2);
[/pawn]
ezt az eredményt kaptam:
 
[2011.08.21 14:35:34] 1
[2011.08.21 14:35:34] 2
[2011.08.21 14:35:34] 3
[2011.08.21 14:35:34] 4
[2011.08.21 14:35:34] 5
[2011.08.21 14:35:34] 6
[2011.08.21 14:35:34] 7
[2011.08.21 14:35:34] 8
[2011.08.21 14:35:34] 9
[2011.08.21 14:35:34] 10
[2011.08.21 14:35:34] 
[2011.08.21 14:35:34] 0
[2011.08.21 14:35:34] 1
[2011.08.21 14:35:34] 2
[2011.08.21 14:35:34] 3
[2011.08.21 14:35:34] 4
[2011.08.21 14:35:34] 5
[2011.08.21 14:35:34] 6
[2011.08.21 14:35:34] 7
[2011.08.21 14:35:34] 8
[2011.08.21 14:35:34] 9
[/quote]
Akkor ez alapján még se ugyanaz.
 
[/quote]
Nem erre gondoltam.
Részben ugyanazt hajtja végre, csak 1-el eltér az érték, ha a rövidebb változatot használod, viszont a többit nézve, a lefordított kód már ugyanúgy néz ki. (csak más értékeket kezel, annyi a különbség, ahogy te le is tesztelted)
« Utoljára szerkesztve: 2011. Augusztus 21. - 16:07:47 írta Fade シ »

[Leírás] Kód optimalizáció/Forráskód értelmezésének nehezítése
« Válasz #10 Dátum: 2011. Augusztus 21. - 16:26:44 »
0
\"csak 1-el eltér az érték\" eredményezi a Run time error 4: \"Array index out of bounds\" hiba üzenetet  :angel:
Ha valaki erre nem figyel oda.
« Utoljára szerkesztve: 2011. Augusztus 21. - 16:29:07 írta Zsolesszka »

 

SimplePortal 2.3.7 © 2008-2024, SimplePortal