Autor Zpráva
Suta
Profil
Chci se zeptat, čím je ovlivněn průběh funkcí setTimeout (v cyklu) či setInterval. Resp. čím může být zapříčiněno nedodržování nastavených časových intervalů.

Uvedu konkrétné příklad. Nedávnou jsem si pro vlastní zdokonalení v javascriptu naprogramoval jednoduchý pinball.

1. Měl jsem div určité šířky.
2. V něm jsem pomocí setInterval() spustil pohyb kuličky, která vždy po dosáhnutí hrany divu změnila směr. Tedy neustále se pohybovala uvnitř divu.

Bohužel prohlížeč nedodržoval naprosto přesné dodržování intervalu, takže pohyb kuličky nebyl plynulý. Někdy se znenadání kulička zrychlila, jindy zpomalila...

Nyní řeším podobný případ, kdy spouštím funkci, která nastavuje v cyklu opacity a prvek zmizí / zobrazí se. Opět však provedení operace není plynulé, pokaždé dojde k jinak rychlému proběhnutí cyklu.

Čím to může být zapříčiněno a jak dosáhnout v javascriptu naprosto přesného dodržování spouštěných operací?

Díky moc za radu.
ah01
Profil
Suta:
http://ejohn.org/blog/how-javascript-timers-work/
Suta
Profil
ah01:
Díky moc za odkaz. Nevěděl jsem, že je takový rozdíl mezi setTimeout volaném v cyklu a setInterval. Angličtinu ovládám velmi okrajově, ale snad jsem pochopil správně, že (můj výklad):

- každé provedení funkce spuštěné pomocí setTimeout je závislé na dalších probíhajících (či skrytých) operacích, takže požadované spuštění po 10 milisekundách bude reálně spuštěno buď později, nebo v případě nahromaděných požadavků ve frontě rychleji za sebou,

- zatímco použití setInterval se "pokusí" spouštět požadovanou funkci přesně každých 10 milisekund.

Z toho mi vyplývá, že použití setInterval je pro "animaci" výhodnější.
Pozn.: skutečně jsem nyní zkusil vyměnit setTimeout za setInterval a efekty mi probíhají daleko plynuleji!

Chápu to správně?

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: