Mini Optimizacija #1
Ⅰ) Šta je ovo?
Ovako, planiram da započnem sa pisanjem "mini tutorijala" koje Vam mogu pomoći da rešite sve vaše probleme (gori sam od TOP Shop-a mjkm)
Ovo će biti uglavnom kratke greške koje budem pronalazio u većini objavljenih skripta a i možda se zavuče nešto što ne budete znali...
Ⅱ) Tema tutoriala
U ovo tutorialu sam izdovjio jednu grešku koja većina vas novih ovde pravi a to je (primer):
new nekiTajmer;
forward OgromanTajmer();
public OnGameModeInit()
{
SetTimer("OgromanTajmer", 1000, true);
}
public OnPlayerConnect(playerid)
{
nekiTajmer = 0;
}
public OgromanTajmer()
{
foreach(new i : Player)
{
if(nekiTajmer > 0) {
nekiTajmer --;
}
}
}
CMD:fixveh(playerid, params[])
{
if(nekiTajmer > 0) {
return SendClientMessage(playerid, -1, "Ovu komandu možete koristiti svakih 30 minuta!");
}
if(!IsPlayerInAnyVehicle(playerid)) {
return 1;
}
nekiTajmer = 1800;
RepairVehicle(GetPlayerVehicleID(playerid));
SendClientMessage(playerid, -1, "Popravili ste svoje vozilo!");
return COMMAND_OK; // YSI5
}E sada, da se odmah razumemo, već sam pisao o ovome u jednim od prvih tutoriala koje sam otvorio na ovom forumu ali moram ponovo jer neki i dalje ovo ponavaljaju:
Vi u kodu gore pozivate tajmer svaku sekundu kako bi oduzeli vrednost varijabli za 1 po igraču, to znači da će se to izvršiti 1800 puta za 30 minuta (puta broj igrača kojem "teče" tajmer i da dodamo da se ovako loopuje kroz celu bazu igrača).
E sada, neki koriste ptask za ovo ali ne razumeju da je to samo wrapper koji je bukvalno isti kao SetTimerEx i da je efekat jednako loš.
Kako to možemo da uradimo?
new nekiTajmer;
CMD:fixveh(playerid, params[])
{
// Ako je trenutno vreme koje gettime() vrati manje od onog vremena koje smo dodelili varijabli
if(gettime() < nekiTajmer) {
return SendClientMessage(playerid, -1, "Ovu komandu možete koristiti svakih 30 minuta!");
}
if(!IsPlayerInAnyVehicle(playerid)) {
return 1;
}
nekiTajmer = gettime() + 1800; // Trenutno vreme (u sekundama) PLUS 1800 sekundi (30 minuta)
RepairVehicle(GetPlayerVehicleID(playerid));
SendClientMessage(playerid, -1, "Popravili ste svoje vozilo!");
return COMMAND_OK; // YSI5
}
// Evo jos jedan primer ukoliko imate manje vrednoti za tajmer (ispod 1 minuta)
new antiChatSpam;
public OnPlayerText(playerid, text[])
{
// Ako je trenutno vreme koje tickcount() vrati manje od onog vremena koje smo dodelili varijabli
if(tickcount() < antiChatSpam) {
SendClientMessage(playerid, -1, "Nemojte da spamujete chat!");
return 0;
}
// 3 sekunde = 3000ms (razlika izmedju tickcount i gettime je ta da na tickcount dodajete milisekunde a na gettime sekunde)!
antiChatSpam = tickcount() + 3000;
return 1;
}Ⅲ) Šta smo uradili ovime?
Uradili smo to da smo totalno izbrisali tajmer koji se veoma brzo ponavlja za svakog konektovanog igrača i naučili smo za nove native - gettime i tickcount!
Da ponovim, znam da sam već otvarao sličan tutorijal ali nisam VS radio niti su ljudi videli jer očigledno nema Optimizacija u naslovu, pa neka ovo obeleži #1
31.

