Započeo LuKsA
•13. Jan. 2014.• Zaključano[TUT] PoboljÅ¡anje u VaÅ¡em skriptanju
5,145
pregleda
3
postova
Godfather
Balkan SA:MP
SA-MP Doprinos
Balkan SA:MP
SA-MP DoprinosNovi Član
240 / 250 XP
Početnik(0)
1,918
Postovi:
54
Teme:
Pridružio se:Okt. 2009
13. Jan. 2014.
O Äemu se radi?
Svaki skripter bi morao znati kako i zašto koristi određene metode skriptanja, trebao bi koristiti najkraće metode sa dobrom optimizacijom. Ovaj tutorijal se može primjeniti na druge prog. jezike.
1. Brisanje stringova
Funkcija 'strdel' se inaÄe koristi za brisanja cijelog niza / stringa, prvu "ćeliju" možete lako obrisati sa null terminatorom;
"\0" se indicira kao završetak niza / stringa, zato ako želite obrisati array, morate koristiti loop;
2. Bool arrayevi
Boolean arrayevi se mogu koristiti i kao normalne varijable (s time štedimo puno memorije - oko 20x puta manje), sa y_bitom od YSI-a možemo koristiti navedeno za spremanje 2.147.483.647 vrijednosti unutar booleana;
je toÄno ovo;
Za stavljanje vrijednosti se koristi jednostavno Bit_Set;
(Može se koristiti i Bit_Let za true i Bit_Vet za false, ali nećemo komplicirati.)
3. Smanjenje vrijednosti
Umjesto ovog (koristimo foreach funkciju u ovom primjeru - Link);
Bez problema možemo koristiti ovo (da pojednostavimo);
4. MySQL loadanje podataka
Koristimo G-sTyLeZzZ-ov MySQL plugin.
Bez problema zamjenimo sa (time "štedimo" querieve a samim time i memoriju, tj. u gornjem primjeru bi koristili 400 querieva što bi mogao biti problem);
5. Re-korištenje stringova
Ne morate stvarati vehicle string, bespotrebno je; Možete ga samo "upakirati" u već postavljeni string;
6. Unix timestampovi
Na primjeru;
To prelagano napravimo sa gettime() funkcijom, puno je brža i lakša za korištenje;
7. Player loopovi
Umjesto korištenja ovog;
Bolji naÄin bi bio;
U funkcijama gdje se u loopu provjerava da li je igraÄ RCON Admin (IsAdmin) i u loopu se nalazi 'IsPlayerConnected' funkcija, nju ne moramo koristiti, jer igraÄ koji nije na serveru nemože niti biti admin (tipiÄno kod GF-a).
8. Random funkcija
Umjesto navedene funkcije možemo si olakšati posao;
9. Jednostavnije varijable
Umjesto ovog;
Å tedimo sebi vrijeme i kopiranje.
10. Smanjenje vrijednosti varijable
Ovo si možemo olakšati stavljanjem decrementa u if funkciju;
11. Return u funkciji
Ovu funkciju možemo lako zamjeniti sa ovom (return se ponaša kao if funkcija u određenim uvjetima);
Ili macro;
12. Y-Less
Jedan od važnijih ljudi kad govorimo o PAWN-u, napravio je puno stvari, pojednostavnio, poboljšao rad u PAWN jeziku (sscanf, foreach, y_bit, ycmd).
Koristite njegov YSI i ostale pluginove / inc-ove koje je napravio, olakšat će vam posao i automatski će vam skripta biti bolja i optimiziranija (ako znate šta radite).
Svaki skripter bi morao znati kako i zašto koristi određene metode skriptanja, trebao bi koristiti najkraće metode sa dobrom optimizacijom. Ovaj tutorijal se može primjeniti na druge prog. jezike.
1. Brisanje stringova
Funkcija 'strdel' se inaÄe koristi za brisanja cijelog niza / stringa, prvu "ćeliju" možete lako obrisati sa null terminatorom;
string = '\0';"\0" se indicira kao završetak niza / stringa, zato ako želite obrisati array, morate koristiti loop;
for (new i = 0; i < sizeof(gArray); i ++)
{
gArray = '\0';
}2. Bool arrayevi
Boolean arrayevi se mogu koristiti i kao normalne varijable (s time štedimo puno memorije - oko 20x puta manje), sa y_bitom od YSI-a možemo koristiti navedeno za spremanje 2.147.483.647 vrijednosti unutar booleana;
new BitArray:gUsingPhone;je toÄno ovo;
new bool:gUsingPhone;Za stavljanje vrijednosti se koristi jednostavno Bit_Set;
Bit_Set(gUsingPhone, playerid, true/false);(Može se koristiti i Bit_Let za true i Bit_Vet za false, ali nećemo komplicirati.)
3. Smanjenje vrijednosti
Umjesto ovog (koristimo foreach funkciju u ovom primjeru - Link);
public Timer()
{
foreach(Player, i)
{
if (PlayerInfo > 0)
{
PlayerInfo--;
if (PlayerInfo < 1)
{
// ...
}
}
}
return 1;
}Bez problema možemo koristiti ovo (da pojednostavimo);
public Timer()
{
foreach(Player, i)
{
if (PlayerInfo > 0 && --PlayerInfo < 1)
{
// ...
}
}
return 1;
}4. MySQL loadanje podataka
Koristimo G-sTyLeZzZ-ov MySQL plugin.
stock LoadHouses()
{
new query;
for (new i = 0; i < MAX_HOUSES; i ++)
{
format(query, sizeof(query), "SELECT * FROM `Houses` WHERE `houseID` = '%d'", i);
mysql_query(query);
mysql_store_result();
if (mysql_num_rows())
{
while (mysql_retrieve_row())
{
// Ostalo..
}
}
}
return 1;
}Bez problema zamjenimo sa (time "štedimo" querieve a samim time i memoriju, tj. u gornjem primjeru bi koristili 400 querieva što bi mogao biti problem);
stock LoadHouses()
{
mysql_query("SELECT * FROM `Houses`");
mysql_store_result();
if (mysql_num_rows())
{
while (mysql_retrieve_row())
{
new houseid = mysql_fetch_int();
// Ostalo..
}
}
}5. Re-korištenje stringova
new
string[30+MAX_PLAYER_NAME],
vehicle;
GetVehicleName(vehicleid, vehicle, sizeof(vehicle));
format(string, sizeof(string), "Vozite %s.", vehicle);
SendClientMessage(playerid, COLOR_WHITE, string);Ne morate stvarati vehicle string, bespotrebno je; Možete ga samo "upakirati" u već postavljeni string;
new string[50+MAX_PLAYER_NAME];
GetVehicleName(vehicleid, string, sizeof(string));
format(string, sizeof(string), "Vozite %s.", string);
SendClientMessage(playerid, COLOR_WHITE, string);6. Unix timestampovi
Na primjeru;
new gUsedChat;
CMD:chat(playerid, params[])
{
if (gUsedChat)
return SendClientMessage(playerid, -1, "Molimo pricekajte 30 sekundi da biste opet pisali.");
// ...
gUsedChat = 1;
SetTimerEx("CanUseChat", 30000, false, "d", playerid);
return 1;
}
forward CanUseChat(playerid);
public CanUseChat(playerid)
{
gUsedChat = 0;
return 1;
}To prelagano napravimo sa gettime() funkcijom, puno je brža i lakša za korištenje;
new gUsedChat;
CMD:chat(playerid, params[])
{
if ((gettime() - gUsedChat) > 0)
return SendClientMessage(playerid, -1, "Molimo pricekajte 30 sekundi da biste opet pisali.");
// ...
gUsedChat = gettime() + 30;
return 1;
}7. Player loopovi
Umjesto korištenja ovog;
for (new i = 0; i != MAX_PLAYERS; i ++)Bolji naÄin bi bio;
for (new i = 0, j = GetMaxPlayers(); i != j; i ++)
//ili koriÅ¡tenje foreachaU funkcijama gdje se u loopu provjerava da li je igraÄ RCON Admin (IsAdmin) i u loopu se nalazi 'IsPlayerConnected' funkcija, nju ne moramo koristiti, jer igraÄ koji nije na serveru nemože niti biti admin (tipiÄno kod GF-a).
8. Random funkcija
switch (random(5))
{
case 0: SetPlayerSkin(playerid, 253);
case 1: SetPlayerSkin(playerid, 117);
case 2: SetPlayerSkin(playerid, 299);
case 3: SetPlayerSkin(playerid, 1);
case 4: SetPlayerSkin(playerid, 17);
}Umjesto navedene funkcije možemo si olakšati posao;
static const
gRandomSkins[] = {253, 117, 299, 1, 17};
SetPlayerSkin(playerid, gRandomSkins[random(sizeof(gRandomSkins))]);9. Jednostavnije varijable
enum gPlayerEnum
{
pWeapon1,
pWeapon2,
pWeapon3,
pWeapon4,
pWeapon5
};Umjesto ovog;
enum gPlayerEnum
{
pWeapons
};Å tedimo sebi vrijeme i kopiranje.
10. Smanjenje vrijednosti varijable
public Timer()
{
foreach(Player, i)
{
if (PlayerInfo > 0)
{
PlayerInfo--;
if (PlayerInfo < 1)
{
// ...
}
}
}
return 1;
}Ovo si možemo olakšati stavljanjem decrementa u if funkciju;
public Timer()
{
foreach(Player, i)
{
if (PlayerInfo > 0 && --PlayerInfo < 1)
{
// ...
}
}
return 1;
}11. Return u funkciji
stock IsPlayerNearCoords(playerid)
{
if (IsPlayerInRangeOfPoint(playerid, 5.0, 1.0000, 2.0000, 3.0000))
{
return 1;
}
return 0;
}Ovu funkciju možemo lako zamjeniti sa ovom (return se ponaša kao if funkcija u određenim uvjetima);
stock IsPlayerNearCoords(playerid)
{
return IsPlayerInRangeOfPoint(playerid, 5.0, 1.0000, 2.0000, 3.0000);
}Ili macro;
#define IsPlayerNearCoords(%0) \
(IsPlayerInRangeOfPoint((%0), 5.0, 1.0000, 2.0000, 3.0000))12. Y-Less
Jedan od važnijih ljudi kad govorimo o PAWN-u, napravio je puno stvari, pojednostavnio, poboljšao rad u PAWN jeziku (sscanf, foreach, y_bit, ycmd).
Koristite njegov YSI i ostale pluginove / inc-ove koje je napravio, olakšat će vam posao i automatski će vam skripta biti bolja i optimiziranija (ako znate šta radite).
Morate biti prijavljeni da biste odgovorili na ovu temu.
Prijava