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 tutorialaU ovo tutorialu sam izdovjio jednu grešku koja većina vas novih ovde pravi a to je (primer):
[pawn]new nekiTajmer[MAX_PLAYERS];
forward OgromanTajmer();
public OnGameModeInit()
{
SetTimer("OgromanTajmer", 1000, true);
}
public OnPlayerConnect(playerid)
{
nekiTajmer[playerid] = 0;
}
public OgromanTajmer()
{
foreach(new i : Player)
{
if(nekiTajmer
> 0) {
nekiTajmer --;
}
}
}
CMD:fixveh(playerid, params[])
{
if(nekiTajmer[playerid] > 0) {
return SendClientMessage(playerid, -1, "Ovu komandu možete koristiti svakih 30 minuta!");
}
if(!IsPlayerInAnyVehicle(playerid)) {
return 1;
}
nekiTajmer[playerid] = 1800;
RepairVehicle(GetPlayerVehicleID(playerid));
SendClientMessage(playerid, -1, "Popravili ste svoje vozilo!");
return COMMAND_OK; // YSI5
}[/pawn]
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?
[pawn]new nekiTajmer[MAX_PLAYERS];
CMD:fixveh(playerid, params[])
{
// Ako je trenutno vreme koje gettime() vrati manje od onog vremena koje smo dodelili varijabli
if(gettime() < nekiTajmer[playerid]) {
return SendClientMessage(playerid, -1, "Ovu komandu možete koristiti svakih 30 minuta!");
}
if(!IsPlayerInAnyVehicle(playerid)) {
return 1;
}
nekiTajmer[playerid] = 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[MAX_PLAYERS];
public OnPlayerText(playerid, text[])
{
// Ako je trenutno vreme koje tickcount() vrati manje od onog vremena koje smo dodelili varijabli
if(tickcount() < antiChatSpam[playerid]) {
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[playerid] = tickcount() + 3000;
return 1;
}[/pawn]
Ⅲ) Š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.