Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> requestAnimationFrame() - sens
-arrtxp-
post 8.09.2013, 16:12:13
Post #1





Goście







Witam, może ktoś mi na chłopski rozum wytłumaczyć po co ta funckja jest ?

  1. Window.requestAnimationFrame()


Nie odsyłajcie mnie do google... chce dostać coś po polsku i przykład zastosowania. Trollom z góry dziękuje...
Go to the top of the page
+Quote Post
lukasz1985
post 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) :
[JAVASCRIPT] pobierz, plaintext
  1. function poszerz() {
  2. div.style.width += 1; // poszerz diva o 1
  3. setTimeout(poszerz, 60); // wykonaj poszerz po 60 ms
  4. }
  5.  
  6. window.onload = function() {
  7. poszerz();
  8. }
[JAVASCRIPT] pobierz, plaintext


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:

[JAVASCRIPT] pobierz, plaintext
  1.  
  2. function poszerz() {
  3. div.style.width += 1; // poszerz diva o 1
  4. }
  5.  
  6.  
  7. window.onload = function() {
  8. setInterval(poszerz, 60); // Wykonuj poszerz co 60 ms.
  9. }
  10.  
[JAVASCRIPT] pobierz, plaintext


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:

[JAVASCRIPT] pobierz, plaintext
  1. function poszerz() {
  2. div.style.width += 1; // poszerz diva o 1
  3. requestAnimationFrame(poszerz);
  4. }
  5.  
  6.  
  7. window.onload = function () {
  8. poszerz();
  9. }
  10.  
[JAVASCRIPT] pobierz, plaintext


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:

[JAVASCRIPT] pobierz, plaintext
  1. // Poniższe czasy są w milisekundach
  2. var czasPoprzedni; // Moment poprzedniego wykonania poszerz()
  3. var czasRoznica ; // Czas który upłynął od poprzedniego wykonania poszerz()
  4. var czasBiezacy; // Bieżący moment
  5.  
  6. function poszerz() {
  7. czasBiezacy = new Date.getTime();
  8. czasRoznica = czasBiezacy - czasPoprzedni;
  9. div.style.width += (czasRoznica) * 0.01; // poszerz diva o 1
  10. requestAnimationFrame(poszerz);
  11. }
  12.  
  13.  
  14. window.onload = function () {
  15. czasPoprzedni = new Date.getTime();
  16. poszerz();
  17. }
  18.  
[JAVASCRIPT] pobierz, plaintext


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 smile.gif 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.

Go to the top of the page
+Quote Post
-arrtxp-
post 11.09.2013, 16:44:50
Post #3





Goście







dzięki, za odpowiedź, choć juz się doczytałem w google wink.gif
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 30.05.2024 - 14:32