Balkan SA:MP

San Andreas Multiplayer - www.sa-mp.com => Pomoć u vezi SAMP-a => Pomoć u vezi SA-MP servera => Temu započeo: ZicMortal poslato Jul 31, 2010, 17:41:34 POSLE PODNE

Naslov: Greska u modu?
Poruka od: ZicMortal poslato Jul 31, 2010, 17:41:34 POSLE PODNE
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.
Naslov: Odg: Greska u modu?
Poruka od: Correlli poslato Jul 31, 2010, 17:44:11 POSLE PODNE
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.
Naslov: Odg: Greska u modu?
Poruka od: ZicMortal poslato Jul 31, 2010, 17:51:48 POSLE PODNE
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?
Naslov: Odg: Greska u modu?
Poruka od: Correlli poslato Jul 31, 2010, 18:00:50 POSLE PODNE
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.
Naslov: Odg: Greska u modu?
Poruka od: ZicMortal poslato Jul 31, 2010, 18:03:15 POSLE PODNE
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
Naslov: Odg: Greska u modu?
Poruka od: Correlli poslato Jul 31, 2010, 18:25:39 POSLE PODNE
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.
Naslov: Odg: Greska u modu?
Poruka od: ZicMortal poslato Jul 31, 2010, 18:35:32 POSLE PODNE
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  :-[
Naslov: Odg: Greska u modu?
Poruka od: Correlli poslato Jul 31, 2010, 18:40:07 POSLE PODNE
Onda stavi kakvu kodu u ovu temu da vidim kako koristiš koji SetTimerEx ili objasni ako znaš.
Naslov: Odg: Greska u modu?
Poruka od: ZicMortal poslato Jul 31, 2010, 18:55:31 POSLE PODNE
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
Naslov: Odg: Greska u modu?
Poruka od: Correlli poslato Jul 31, 2010, 19:21:08 POSLE PODNE
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;
}
Naslov: Odg: Greska u modu?
Poruka od: 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)

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)...
Naslov: Odg: Greska u modu?
Poruka od: Correlli poslato Jul 31, 2010, 20:07:13 POSLE PODNE
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.
Naslov: Odg: Greska u modu?
Poruka od: ZicMortal poslato Avgust 01, 2010, 00:23:00 PRE PODNE
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  :-[

Naslov: Odg: Greska u modu?
Poruka od: Correlli poslato Avgust 01, 2010, 00:49:14 PRE PODNE
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.
Naslov: Odg: Greska u modu?
Poruka od: ZicMortal poslato Avgust 01, 2010, 08:12:53 PRE PODNE
Znam to, nego trenutno pokuÅ¡avam rijeÅ¡it tu greÅ¡ku koja me je dosad jebala...  :-\
Naslov: Odg: Greska u modu?
Poruka od: |GG|Vlado poslato Avgust 01, 2010, 11:20:12 PRE PODNE
Pogledaj stringove potrudi se da budu 128 a ne 256
Naslov: Odg: Greska u modu?
Poruka od: LordShigi poslato Avgust 01, 2010, 11:36:54 PRE PODNE
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)