Mini Optimizacija #1

Započeo skritpe iz 2007 godine. ( ͡° ͜ʖ ͡°), Avgust 01, 2020, 16:44:26 POSLE PODNE

prethodna tema - sledeća tema

0 članova i 1 gost pregledaju ovu temu.

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):
[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.


Nije loše, fino je, dobar tutorial :)
Balkan Moon v1.0 by Foxy

Owner // Scripter Balkan Moon

u Potpisu Foxy.

Ne pipaj lava Foxy, radi na BM-u :D :D :D
[4.7.2019] Respect For: Purda | Basovski | Mister Naithan | BICEL KO MI BUNTA | 7.9: Vasic[/b]

* Server [5.1.2019 Created]
* Scripter on Power Gaming
* Scripter on Night Life
* Scripter on Arena Gaming
* Scripter on duty (Balkan Moon)

[23.5.2k19] Messi u skriptanju hehe ;)
[7.8.2k19]OLD Minecraft Developer & Player (2016-2018)

#FOXYSCRIPT[/b]
MAPPER U POKUŠAJU :/[/b]