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.
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.
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?
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.
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
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.
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 :-[
Onda stavi kakvu kodu u ovu temu da vidim kako koristiš koji SetTimerEx ili objasni ako znaš.
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
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;
}
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)...
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.
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 :-[
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.
Znam to, nego trenutno pokušavam riješit tu grešku koja me je dosad jebala... :-\
Pogledaj stringove potrudi se da budu 128 a ne 256
Napisao sam tu TUT za te stringove, pa procitaj i optimiziraj.
http://balkan-samp.com/forum/index.php?topic=10871.msg81892;boardseen#new (http://balkan-samp.com/forum/index.php?topic=10871.msg81892;boardseen#new)