requestAnimationFrame() - sens |
requestAnimationFrame() - sens |
-arrtxp- |
8.09.2013, 16:12:13
Post
#1
|
Goście |
|
|
|
10.09.2013, 19:45:42
Post
#2
|
|
Grupa: Zarejestrowani Postów: 205 Pomógł: 43 Dołączył: 5.03.2012 Ostrzeżenie: (0%) |
Funkcja requestAnimationFrame służy do robienia animacji tak jak setInterval i setTimeout, a jej plusem ma być to, że ma mieć lepszą wydajność od pozostałych. Piszę "ma" bo to implementacja(czyli jak ta funkcja rzeczywiście się działa) zależy od przeglądarki jednak postaram Ci się to wyjaśnić jak tej funkcji użyć, zakładając pewną (oczywistą) implementację przez przeglądarkę.
Załóżmy, że masz do zrobienia jakąś animację, na przykład masz DIVa, który będzie się rozszerzać. Jest kilka sposobów na to, możesz użyć: - setTimeout - setInterval, albo - requestAnimationFrame W przypadku dwóch pierwszych sprawa wygląda dość prosto, używając setTimeout robisz coś takiego (będę pisał z kilkoma uproszczenami) :
Włączasz okno przeglądarki - okno się ładuje, po załadowaniu wykonuje się poszerz(). Funkcja poszerz() na końcu wyznacza czas po którym znów ma sie wykonać (setTimeout) . Efekt jest taki, że funkcja się zapętla i wykonuje się co 60 ms Używając setInterval wyznaczasz interwał (przerwy) pomiędzy wykonaniami tej samej funkcji:
Program analogiczny do powyższego. No i pora na requestAnimationFrame. Funkcja requestAnimationFrame (będę używał skrótu RAF) przyjmuje za argument tylko inną funkcję, a nie przyjmuje żadnych odstępów czasowych. Ktoś mógłby się zapytać, w jaki sposób w takim razie zrobić przy jej pomocy animację? Otóż RAF nie działa tak jak setTimeout i setInterval. RAF powoduje że funkcja, którą jej prześlemy wywoła się w momencie najlepszym dla przeglądarki. Co oznacza ten najlepszy moment? Ten moment to taki moment w którym synchronizacja animacji z odświeżaniem ekranu jest najlepsza. Powiedzmy, że w powyższych przykładach dałeś 1 milisekunde. Oznacza to, że Twoja funkcja "poszerz()" musiałaby się wykonywać co 1 milisekunde. Co dałoby animację , której częstotliwość wynosi 1000 klatek/sekunde (fps). Teraz pytanie: po co to komu, skoro okno przeglądarki jest rysowane z częstotliwością np. 60 klatek/sekundę? Marnujesz tylko procesor. Problem polega na tym, że Ty nie wiesz z jaką częstotliwością okno przeglądarki jest wyświetlane. To może być 60 fps lub równie dobrze 10 fps, jeśli masz otwarte 20 kart i jakąś mocną grę w tle. To wie sama przeglądarka i tylko ona zna najlepszy moment wykonania Twojej funkcji tak aby została ona wykonana przed kolejnym odświeżeniem okna przeglądarki. W kodzie będzie to wyglądało tak:
Zauważ jednak pewną rzecz.. Twój DIV będzie się poszerzał w takim tempie w jakim okno przeglądarki jest odświeżane. Żeby sobie z tym poradzić najlepiej jest obliczyć czas jaki upłynął od ostatniego odświeżenia:
Tak więc teraz im większa różnica pomiędzy poszczególnymi wywołaniami poszerz() tym więcej poszerzy się DIV. W przypadku 1 klatki na sekundę poszerzy się o (1000 * 0.01 = 10) pikseli/ klatkę, przy 60 klatkach/sekunde to będzie (1000/60 * 0.01 = oblicz sobie pikseli / klatkę. 1 klatka na sekundę daje bardzo niepłynną "animację" to też zobaczysz diva , który będzie się poszerzał skokowo, w przypadku 60 zobaczysz płynną animację. Mam nadzieję, że to nieco wyjaśnia użycie RAF. Jak powiedziałem wiele zależy od tego jak to implementują przeglądarki. W każdym razie - podstawowa zasada - to synchronizacja odświeżania okna z funkcją, która ma animować obiekty. |
|
|
-arrtxp- |
11.09.2013, 16:44:50
Post
#3
|
Goście |
dzięki, za odpowiedź, choć juz się doczytałem w google
|
|
|
Wersja Lo-Fi | Aktualny czas: 30.05.2024 - 14:32 |