Balkan SA:MP

PAWN skriptanje, gamemodovi, filterskripte, include fajlovi, mape, pluginovi => Razgovor u vezi PAWN - skriptanja => Temu započeo: [MG]uNiqu3 poslato Februar 09, 2014, 15:52:31 POSLE PODNE

Naslov: [Savjet]Optimizacija
Poruka od: [MG]uNiqu3 poslato Februar 09, 2014, 15:52:31 POSLE PODNE
O kakvom savjetu se radi:Optimizacija gmoda
Detaljan opis savjeta:Pa kako najbole da optimizujer moj gmod ?
Komentar:/
Naslov: Odg: [Savjet]Optimizacija
Poruka od: Ermin. poslato Februar 09, 2014, 16:25:15 POSLE PODNE
O boze dragi to je sirok pojam, ali evo par predloga kako da pocens.

1. Koristi ternary operator.
2. Smanji cellove, koristi samo koliko ti je potrebno.
3. Koristi pakirane stringove (char arrays) (vise o tome na wiki)

Dalje, vecina koristi 'PlayerName', koja returna string(jednodimenzionalni niz / array) sa igracevim imenom.

Primjer:

stock PlayerName(playerid)
{
    new pName[MAX_PLAYER_NAME];
    GetPlayerName(playerid, pName, sizeof pName);
    return pName;
}

- Ovo ne preporucujem, jer zamisli da negdje trebas 4-5 puta igracevo ime, zasto bi pozivao GetPlayerName 5 puta ako mozes samo jednom.
Mada najbolje da pri konektovanju igraca njegovo ime spremis u globalni array.

static PlayerNames[MAX_PLAYERS][MAX_PLAYER_NAME];

public OnPlayerConnect(playerid)
{
    GetPlayerName(playerid, PlayerNames[playerid], MAX_PLAYER_NAME);
    return 1;
}


4. Koristi switch naredbu, jednostavno je brze i preglednije nego if-else.
5. Komande za koje nisu potrebni parametri, ne koristi YCMD/ZCMD nego strcmp, brzi je dosta.
6. Smanji broj tajmera i funkcije nepotrebne.

Dalje mogu nabrajat dosta ali neda mi se jednostavno imas dosta tutoriala po sa-mp.com o optimizaciji.
Naslov: Odg: [Savjet]Optimizacija
Poruka od: Slay poslato Februar 09, 2014, 17:07:38 POSLE PODNE
prije svega moras vidjeti kakvu optimizaciju trebas,jel trebas memorije ili brzine u skripti...

za memorijsku optimizaciju moras razumjeti polja i opcenito rad sa stringovima,kada kreiras polja nauci se sluziti staticnom/dinamicnom alokacijom memorije,ylessov malloc (memory allocation) koristi...

osim toga,kada pricamo o brzini najvece probleme stvaraju petlje, timeri i fileovi,savjet moj ti je da koristis mysql ili sqllite,opcenito sql implementacija se preporucuje...

sve sto trebas nekakvu vrstu iteracije ne znaci da trebas stvarati petlju ili timer, nauci raditi rekurzije jer mozes smanjiti potrebu za petljama cak do 30-40%

timer mozes koristiti jedan i onda koristis varijable da reguliras tocno ivrsavanje nekakvog bloka naredbi i sl.
timere mozes zamjeniti timestamp-om i koristiti callbackove sto je jos bolje jer onda samo spremas u varijablu vrijednost i pod nekim callbackom, recimo onplayerupdate samo provjeris jel proslo vrijeme vece ili jednako trenutnom timestamp-u

ima jako puno trikova i metoda kojima se mozes sluziti,pogotovo u pawn jeziku gdje nemas nekih prevelikih mogucnosti pa se onda sluzis svime i svacime za izbjegnes sve mane kojih nazalost ima jako jako puno...

Citat: Ermin. poslato Februar 09, 2014, 16:25:15 POSLE PODNE
4. Koristi switch naredbu, jednostavno je brze i preglednije nego if-else.
5. Komande za koje nisu potrebni parametri, ne koristi YCMD/ZCMD nego strcmp, brzi je dosta.
6. Smanji broj tajmera i funkcije nepotrebne.

1. switch radi isto sta i if statement tako da ne moze biti brzi,isto usporedjuje i nema nikakve razlike u brzini
2. zcmd/ycmd ce uvijek biti brzi od strcmp jer strcmp je samo funkcija za usporedbu stringa,a zapravo ti koristis IF, callremotefunction ce uvijek biti brzi za komande jer ne trazi tocan rezultat nego direktno poziva komandu,dok sa kako ti kazes 'strcmp' mora usporediti svaku komandu i tek onda je izvrsava
6. funkcije nisu problem,funkcija mozes imati 100000 i mogu biti brze nego da imas jednu,bitan je sadrzaj funkcije.... sta se timera tice, napisao sam gore ima puno trikova sa njima

Citat: Ermin. poslato Februar 09, 2014, 16:25:15 POSLE PODNE
Primjer:

stock PlayerName(playerid)
{
    new pName[MAX_PLAYER_NAME];
    GetPlayerName(playerid, pName, sizeof pName);
    return pName;
}

- Ovo ne preporucujem, jer zamisli da negdje trebas 4-5 puta igracevo ime, zasto bi pozivao GetPlayerName 5 puta ako mozes samo jednom.
Mada najbolje da pri konektovanju igraca njegovo ime spremis u globalni array.

static PlayerNames[MAX_PLAYERS][MAX_PLAYER_NAME];

public OnPlayerConnect(playerid)
{
    GetPlayerName(playerid, PlayerNames[playerid], MAX_PLAYER_NAME);
    return 1;
}


pozivanje funkcije nece stvoriti nikakav problem,veci problem ce biti to sta ti kazes spremanje u 2-dimenzionalno polje,sto ce uzeti recimo ovako...

500 igraca
prosjek duzine igracevih imena recimo da je 5 to je

500*5 = 2500 cellova, za jednu stvar, a prosjek sigurno nije 5 znakova u imenu,to sigurno nije bolje od pozivanja jedne funkcije i opet kod prikljucivanja igraca moras pozvati funkciju,ovo nema nikakvog smisla... funkcije nisu nikakav problem pogotovo ovakve, stovise, preporucaju se iz vise razloga, a jedan od glavnih je klasifikacija (u oop poznat pojam)

i ono najzanimljivije je da je moj primjer totalno ublazen,ti si koristio konstante

MAX_PLAYERS * MAX_PLAYER_NAME = 12,000  :-\

napisao si jako puno gluposti,ne znam koja je smjesnija od koje ko sta sam jucer vidio isto http://balkan-samp.com/forum/index.php?topic=85437.msg576343#new - imati dobru namjeru je u redu ali stvar je ovdje sta previse ovdje misli da znaju,a nisu nikad nista drugo radili od pawna i nemam nista protiv ali ovdje je to globalna zaraza koja vlada na ovom forumu i sta ce sutradan isto ovaj kojem sada ti pises to misliti da je naucio i onda to pricati... tako da nista ne shvatis da sam htio bit bezobrazan iskreno i briga me dodjem tu jednom u par mj. ali jednostavno kada napises nesto moras bit svjestan svoga znanja i temi o kojoj pises... pozz