bebras

Timers

Recommended Posts

Sveiki, neprid─Śjau [Pamoka] nes ─Źia nemokysiu ka┼żkokio konkretaus dalyko. Tiesiog nor─Śjau sukurti tem─ů kurioje gal─Śtume aptarti timerius, juk tiek daug apie juos ir j┼│ greiti kalbama...

K─ů vadiname timeriu pawn? Tai funkcija kuri bus i┼íkviesta u┼ż nurodyto laiko.

Timeriai yra "kuriami" su dviem funkcijom: SetTimer, ─»prastas timer, bei SetTimerEx, timeris su papildomais parametrais.

Daugyb─Ö ┼żmoni┼│ (neapsiriboju ┼íiuo forumu ar Lietuva) teigia kad timeriai "lagina" server─». ┼Żinoma niekam niekada netrukd─Ś vienas timeris. Bet kaip dauguma mat─Śt─Ś, GRP, vien ─»jungus server─» paleid┼żiami 5-6timeriai, jau nekalbu apie dar bent 2 asmeninius timerius...

Tai tikrai didel─Ś problema, ypa─Ź kai tie timeriai kartojasi vienodu metu (pvz du timeriai kas 1min), kam to reikia? Skai─Źiau ka┼żkur kaip Y_Less trumpai apib┼źdino timeri┼│ veikim─ů (dabar nerandu..), esm─Ś kad ka┼żkuriuo metu, ┼żaid─Śjas n─Śra sinchronizav─Ösis su serveriu. K─ů tai rei┼íkia? Tai rei┼íkia kad ┼żaid─Śjas yra "atsijung─Ös" nuo serverio ir "sugr─»┼í" tik tada kai timeris baigs tvarkyt reikalus.

┼átai pana┼íus pavizdys kur─» pats ma─Źiau:


SetTimer("Timer1",1000,true);
SetTimer("Timer2",1000,true);

forward Timer1();
public Timer1()
{
//ka┼żkas vyksta
}
forward Timer2();
public Timer2()
{
///Vel ka┼żkas vyksta
}

Kai kas galvoja: aha, du timeriai tuo pa─Źiu metu, rei┼íkia 2 skirtingi kodo blokai bus vykdomi vienu metu! Tikrai ne, apskritai sa-mp serveris veikia ant vieno thread of execution (d─Śja ne┼żinau Lietuvi┼íko ┼żod┼żi┼│ atitikmens). Ir v─Śl, k─ů tai rei┼íkia? Tai kad niekada 2 kodo blokai nebus vykdomi vienu metu. T.y. bus nuspr─Östa(o tai sprend┼żiasi giliai kompiuteryje,berods) kuris eis pirmas, o kitas lauks. ─îia ─»terpsiu smulkmena apie MySQL, jeigu neklystu(esu beveik tikras kad neklystu), naujosios mysql versijos veikia ant atskiro thread of execution, bet ai┼íku ─Źia kita tema.

Taipat, labai didel─Śs funkcijos timeryje "lagins" ┼żaid─Śjui. Kadangi kaip min─Śjau, kol timerio funkcija nebus baigta, ┼żaid─Śjas nesinchronizuosis su serveriu.

Ir dar ne viskas apie timerius! Pasirod yra dar vienas didelis tr┼źkumas... jie yra labai netiksl┼źs! Yra daug kur test┼│ rezultat┼│, bet a┼í atlikau savo. ┼átai testavimo kodas:


new MinTick,SecTick;
forward Minute();
forward Sekunde();
public OnGameModeInit()
{
mysql_debug(1);
SetTimer("Minute",60000,true);
MinTick = GetTickCount();
SetTimer("Sekunde",1000,true);
SecTick = GetTickCount();
return 1;
}

public Minute()
{
printf("Minutes timeris buvo iskviestas po %d MS",GetTickCount() - MinTick);
return 1;
}
public Sekunde()
{
printf("Sekundes timeris buvo iskviestas po %d MS",GetTickCount() - SecTick);
return 1;
}

Ir ┼ítai vienos sekund─Śs timerio rezultatai:


[19:19:52] Sekundes timeris buvo iskviestas po 1075 MS
[19:19:53] Sekundes timeris buvo iskviestas po 2200 MS
[19:19:54] Sekundes timeris buvo iskviestas po 3315 MS
[19:19:56] Sekundes timeris buvo iskviestas po 4430 MS
[19:19:57] Sekundes timeris buvo iskviestas po 5550 MS
[19:19:58] Sekundes timeris buvo iskviestas po 6660 MS
[19:19:59] Sekundes timeris buvo iskviestas po 7770 MS
[19:20:00] Sekundes timeris buvo iskviestas po 8886 MS

Pagal id─Śja tur─Śjome pamatyti lygius skai─Źius, 1000,2000,3000 ir t.t. Jau po pa─Źio pirmojo i┼íkvietimo paklaida yra 75MS. Tai gal ir neatrodo daug... Bet pa┼żi┼źr─Śkime kas darosi toliau? Paklaidos susid─Śs...ir timeris per 60 sekund┼żi┼│ bus i┼íkviestas ne 60 kart┼│.

Minutinio timerio rezultatai:


[19:20:58] Minutes timeris buvo iskviestas po 66574 MS
[19:22:04] Minutes timeris buvo iskviestas po 132610 MS

I┼ívis ka┼żkas "lempinio", ar ne?

Kai kurie turb┼źt jau galvoja kad viskas, pasaulio pabaiga...nenaudosiu niekada timeri┼│, bet visada yra tas "bet". Yra i┼íleistas "timerfix" include. Oficiali jo tema. (Ir ten rasite atlikt┼│ test┼│).

Sekundinio timerio testas atliktas su timerfix.inc:


[19:24:54] Sekundes timeris buvo iskviestas po 1004 MS
[19:24:55] Sekundes timeris buvo iskviestas po 2004 MS
[19:24:56] Sekundes timeris buvo iskviestas po 3004 MS
[19:24:57] Sekundes timeris buvo iskviestas po 4004 MS
[19:24:58] Sekundes timeris buvo iskviestas po 5004 MS
[19:24:59] Sekundes timeris buvo iskviestas po 6004 MS
[19:25:00] Sekundes timeris buvo iskviestas po 7004 MS
[19:25:01] Sekundes timeris buvo iskviestas po 8004 MS
[19:25:02] Sekundes timeris buvo iskviestas po 9004 MS

Paklaida nedidesn─Ś nei 4MS, kas jau yra niekis.

Minutinio timerio rezultatai su timerfix:


[19:25:53] Minutes timeris buvo iskviestas po 60007 MS
[19:26:54] Minutes timeris buvo iskviestas po 120541 MS

Tai tiek. Komentuokit, reiškit nuomonę, taisykit mane jei radote netikslumų :)

Redaguota , nario sneroq
  • Teigiamai 6

Dalintis ┼í─» prane┼íim─ů


Nuoroda iki šio pranešimo
Dalintis per kit─ů puslap─»

Dabar tipo reikia dar prideti timeri prie KickPlayer ar ne? Nes man atrodo kad ant 0.3x iskickinus neraso priezsties.

Dalintis ┼í─» prane┼íim─ů


Nuoroda iki šio pranešimo
Dalintis per kit─ů puslap─»

Tai va, jeigu a┼í turiu XP timeri kas 1 minute ir sta┼żas? Kas tada? nes timerius paleid┼żiu ant OnGamemodInt abudu tik ─»sijungus server─». Gal reiktu perkelt ant to kai ─»lipa ─» ma┼íin─ů ;o ta─Źiau, tai jeigu 2 timeriai 1 metu, tai vienas atsiliks?

Dalintis ┼í─» prane┼íim─ů


Nuoroda iki šio pranešimo
Dalintis per kit─ů puslap─»

Tikrai su┼żinojau daugiau , nebloga tema , a┼í timeri┼│ nedaug naudodavau , o jei naudodavau tai bereikalyngu ┼żinu─Źi┼│ siuntimui. Ar ┼íeip kam : nuomos lit┼│ nu─Śmimui.

Dalintis ┼í─» prane┼íim─ů


Nuoroda iki šio pranešimo
Dalintis per kit─ů puslap─»

Tai va, jeigu a┼í turiu XP timeri kas 1 minute ir sta┼żas? Kas tada? nes timerius paleid┼żiu ant OnGamemodInt abudu tik ─»sijungus server─». Gal reiktu perkelt ant to kai ─»lipa ─» ma┼íin─ů ;o ta─Źiau, tai jeigu 2 timeriai 1 metu, tai vienas atsiliks?

Ne, 2 timeriai dar ne ko┼ímaras. I┼í tikr┼│j┼│ du tai niekis. ┼áiaip jei vienas yra labai trumpas, gali sumest ─» vien─ů. Ir ┼íiaip dar vienas dalykas kur─» kartais naudoju, toki dalyk─ů:


OnGameModeInit()
{
 SetTimer("AntiHack",30*1000,true)
 SetTimer("XP",60*1000,true);
 return 1;
}
forward AntiHack();
public AntiHack()
{
   //anti hackas.
}
forward XP();
public XP()
{
/// XP augimas ar kazkas
}

Padarau tokiu

new antihacktoxp;
OnGameModeInit()
{
 SetTimer("XP",60*1000,true);
 return 1;
}
forward XP();
public XP()
{
antihacktoxp++;
/// XP augimas ar kazkas
If (antihacktoxp%2==0)
{
//antihackas
}
}

Dalintis ┼í─» prane┼íim─ů


Nuoroda iki šio pranešimo
Dalintis per kit─ů puslap─»

Man kylo por─ů klausym┼│, ┼żiur─Śk Bebrai. Tarkim noriu padariti tokia funkcija, kai kai paspaudi ENTER arba para┼íai komand─ů, tarkim po 10 sekund┼żi┼│ atsitinka ka┼íkoks veiksmas, kaip reikia u┼żra┼íyti kod─ů pawne, tarkim CMD: test (player;) ir t.t.t

(

Sendclientmessage tarkim: Lipi laiptais, tai u┼żtruks ka┼íkur─» laik─ů. { IR dabar kokia man funkcija d─Śti, kad praeijus 10 sekund┼żi┼│, pasikeistu ┼żaid─Śjo pozicija, arba ─»viktu ka┼íkoks veiksmas ?

Dalintis ┼í─» prane┼íim─ů


Nuoroda iki šio pranešimo
Dalintis per kit─ů puslap─»
//U┼żlipa ant pirmo laipto
SendClientMessage(playerid,-1,"Lipi laiptais, tai u┼żtruks 1 minut─Ö");
SetTimerEx("LipimasLaiptais",60000,false,"i",playerid);

//Timerio funkcija
forward LipimasLaiptais(playerid);
public LipimasLaiptais(playerid)
{
   SetPlayerPos(playerid,//Viršus laiptų.
   SendClientMessage(playerid,-1,"Sveikinu, u┼żlipai laiptais ir u┼żtrukai tik minut─Ö!!!");
   return 1;
}

  • Teigiamai 1

Dalintis ┼í─» prane┼íim─ů


Nuoroda iki šio pranešimo
Dalintis per kit─ů puslap─»
Sve─Źias
┼ái tema yra u┼żrakinta.

  • ┼áiame puslapyje nar┼ío:   0 nariai

    N─Śra registruot┼│ nari┼│ per┼żi┼źrin─Źi┼│ ┼í─» forum─ů.


  • SuperGames programele
  • SuperGames programele