Greska u modu?

Započeo ZicMortal, Jul 31, 2010, 17:41:34 POSLE PODNE

prethodna tema - sledeća tema

0 članova i 1 gost pregledaju ovu temu.

ZicMortal

Razgovarao sam sa hosterom i imam problema sa serverom... to su laggovi i povremeno gašenje servera.

Sad on mi priča da mi mod pocne laggati il neš, dodje do greške i CPU usage bude 99.0 %. Sad govori mi i da je normalno za SA;MP da ne prelazi preko 10 % čak i sa 100 igraća online. Sad pokušavam riješit tu grešku ali nije mi jasno... u čemu može bit greška? Kompajlan mod je velik 2.257 MB. I dosta je skriptan i ima dosta stvari u njemu... ali da je mod neznam kakav (normalan) nemože CPU ić do 100 %.


Molim pomoć, savjet...

Btw. U mogućnost dolazi i novi host, ali pokušavam riješit ovo ukoliko ZBILJA ima greška.

Correlli

Kakvu kodu koristiš u callbacku OnPlayerUpdate? Koliko tajmera koristiš u skripti i koliko je SetTimerEx od tih tajmera?

Spremanje fajlova u OnPlayerUpdate će ubiti server, isto tako loop igrača na SetTimerEx.

ZicMortal

173 timera.. od toga 90 SeTimerEx-a... wow jbt

Takodjer nisam napravio OnPlayerUpdate kao takav nego sam ga definirao kao UpdateIgraca (pošto se OnPlayerUpdate javlja svaki put kad igrač stišće nešto na tipkovnici itd.)

Šta trebam napraviti da bi riješio problem? KillTimer za ove Ex tajmere?
Poslednja Izmena: Jul 31, 2010, 17:54:06 POSLE PODNE od ZicMortal

Correlli

Ne, to neće baš riješiti problem. Kako koristiš sve te tajmere? Kroz loop ili kako? Ako možeš, onda probaj skratiti tajmere i staviti sve u čim manji broj tajmera.

ZicMortal

Znači da smanjim broj timera?

EDIT: Baš sad vidim, u obićnom GodFatheru ima 25 timera, u LSLRP-u ima 50... a u mome 173... eh jbga
Poslednja Izmena: Jul 31, 2010, 18:07:12 POSLE PODNE od ZicMortal

Correlli

Evo ti jedan primjer:

forward mojTajmer(playerid);

public mojTajmer(playerid)
{
       /* koda */
       mojaFunkcija(playerid);
       SendClientMessage(playerid, 0xFFFFFFFF, "..poruka.. text..");
       /* ostala koda */
       return true;
}

public OnPlayerConnect(playerid)
{
       /* koda */
       SetTimerEx("mojTajmer", 1000, true, "i", playerid);
       /* ostala koda */
       return true;
}



A možeš napraviti ovako:

forward mojTajmer();

public mojTajmer()
{
       foreach(Player, u) // foreach() funkciju koristim umjesto for statementa.
       {
               /* koda */
               mojaFunkcija(u);
               SendClientMessage(u, 0xFFFFFFFF, "..poruka.. text..");
               /* ostala koda */
       }
       return true;
}

public OnGameModeInit()
{
       /* koda */
       SetTimer("mojTajmer", 1000, true);
       /* ostala koda */
       return true;
}



I još ako ne ubijaš tajmere kao u ovom primjeru sa SetTimerEx onda ćeš imati ++ tajmer za svaki konekt.
Poslednja Izmena: Jul 31, 2010, 18:29:00 POSLE PODNE od Don Correlli

ZicMortal

Pa tak i radim timere, samo mene zabrinjava ovih 90 timerExa koji ostaju kad se igrac disconnecta ili neÅ¡to drugo... to cu probat rijeÅ¡it  :-[

Correlli

Onda stavi kakvu kodu u ovu temu da vidim kako koristiš koji SetTimerEx ili objasni ako znaš.

ZicMortal

Evo ukratko...

Imam neku komandu recimo /drink... to je za restorane i tako to da ljudi mogu pit'

new PiceTimer[MAX_PLAYERS];

OnDialogResponse

PiceTimer[playerid] = SetTimerEx("Trijezan", 180000, false, "i", playerid);

Tu je meÄ'u ostalom i davanje one boce, i ProxDetector za igraće blizu tog igraća koji je odabrao piće (ono kao /me). To nije tako važno...

forward Trijezan(playerid);

Na pocetku moda...

public Trijezan(playerid)
{
if(IsPlayerConnected(playerid))
{
    if(Pijan[playerid] == 1) // ovo mi je uvjet..
    {
Pijan[playerid] = 0;
KillTimer(PiceTimer[playerid]);
}
}
return 1;
}


Ovo su samo neki zadani uvjeti... dakle bitan je KillTimer... prije ga nisam baš koristio ali sad vjerujem da mi zbog toga mod tako lagga... igrač dobije timer i taj timer stalno stoji (zapravo dosta njih)... i vjerovatno on radi grešku u modu, kao flood na neki nacin... I mislim da je to najvjerovatnije, jer uvijek kad ponovo pokrenem server sve je u redu, nema nikakvog lagga... sve divno i krasno, ali nakon par sati pocnu laggovi :S

Correlli

I činilo se mi je da je nešto tako. To ti uopče ne treba, to može biti u jednom glavnom tajmeru. I najbolje je da ovakav tajmer bude svaku sekundu ako ga ponavljaš, neka nikada ne bude ispod jedne sekunde.

#define PIJAN_VAR ("pijan_Var")
#define PIJAN_INTERVAL (180)


/* OnDialogResponse */
SetPVarInt(playerid, PIJAN_VAR, PIJAN_INTERVAL);

Stavit ćeš "pijan_Var" p-var kao 180 (PIJAN_INTERVAL), znači 180 sekundi ako koristimo to u jedna-sekunda-tajmeru jer si prije koristio 180000 milisekundi interval.

foreach(Player, u)
{
   /* koda u loopu tajmera */
   if(GetPVarInt(u, PIJAN_VAR) == 0)
   {
       Pijan[u] = false;
       SetPVarInt(u, PIJAN_VAR, -1); // default je 0, zato ćemo staviti -1 jer ako bude uvijek 0 onda će se uvijek izvrÅ¡iti ova koda.
   }
   else SetPVarInt(u, PIJAN_VAR, GetPVarInt(u, PIJAN_VAR) - 1);
   /* ostala koda u loopu tajmera. */
}


public OnPlayerConnect(playerid)
{
   SetPVarInt(playerid, PIJAN_VAR, -1); // default je 0, zato ćemo staviti -1 jer ako bude uvijek 0 onda će se uvijek izvrÅ¡iti koda u tajmeru.
   return true;
}
Poslednja Izmena: Jul 31, 2010, 19:22:25 POSLE PODNE od Don Correlli

ZicMortal

I po čemu je to bolje od SetTimex, SetTimerEx i KillTimer? (ak se smije znat)

Sad trenutno u modu imam 120 timera, za svaki SetTimerEx imam KillTimer, a gotovo i za svaki SetTimer kao i za SetTimerEx (KillTimer) osim kod ograda od organizacija (/otvori pa tajmer za automatsko zatvaranje)...

Correlli

Citat: ZicMortal poslato Jul 31, 2010, 19:57:38 POSLE PODNE
I po čemu je to bolje od SetTimex, SetTimerEx i KillTimer? (ak se smije znat)
Pa nisi valjda zaboravio svoj problem? Logično da je bolje imati kodu u 2, 3 tajmera za igrače umjesto da imaš 100 igrač-tajmera.

Citat: ZicMortal poslato Jul 31, 2010, 19:57:38 POSLE PODNE
Sad trenutno u modu imam 120 timera, za svaki SetTimerEx imam KillTimer, a gotovo i za svaki SetTimer kao i za SetTimerEx (KillTimer) osim kod ograda od organizacija (/otvori pa tajmer za automatsko zatvaranje)...[/color]
KillTimer nije važan trenutno. Igrači mogu sa svojim poslovima pokrenuti više igrač-tajmera koji će dovesti do laga.

ZicMortal

Mene više zanima ta greška... promjenio sam sad par stvari oko svih timera, i trudim se da svi timeri budu killani (znam da ne koristi puno, ali ipak smatram da je potrebno)...


Neću se sad upustit u neke velike optimizacije poÅ¡to mislim da bi mod normalno trebao raditi bez pretjeranog zauzimanja CPUa i laggova  :-[


Correlli

Kako god hoćeš, ali iako ti ubiješ igrač-tajmere (SetTimerEx) svejedno ih se može nabrati puno i to može dovesti i do laga a i do server crasha.

ZicMortal

Znam to, nego trenutno pokuÅ¡avam rijeÅ¡it tu greÅ¡ku koja me je dosad jebala...  :-\