2012-12-18 19 views
18

Dla gier HTML5 z animacją na płótnie dla urządzeń mobilnych.setTimeout lub setInterval lub requestAnimationFrame

Mam do czynienia z pewnymi problemami z wydajnością, które różnią się szybkością między każdym urządzeniem a innymi.

requestAnimationFrame przyspieszenie animacji gry zgodnie z prędkością urządzenia.
setInterval zaszokował mnie, że istnieje opóźnienie z urządzenia do innego.
setTimeout jest również powolny rysunek na płótnie.

Osoby, które miały wcześniejszy kontakt z grami Mobile HTML5, mogą pomóc mi w opracowaniu najlepszej z trzech metod (lub innych technik, jeśli są dostępne) do tworzenia animacji na płótnie, która będzie stabilna na różnych urządzeniach mobilnych?

Odpowiedz

19

Zawsze używaj requestAnimationFrame, o ile jest to możliwe, ponieważ właśnie do tego jest przeznaczony. Najlepiej jest use a shim for support, gdy nie jest, więc nie musisz zajmować się konkretnymi szczegółami.

Aby animacja lub logika gry działały z tą samą prędkością, pomimo rzeczywistej stosowanej metody, należy zastosować animację opartą na czasie i obliczenia w czasie dla fizyki.

+0

starej wersji na Android przeglądarek telefonów nie obsługuje requestAnimationFrame (HTC) .... Staram tę witrynę http://ie.microsoft.com/testdrive /Graphics/RequestAnimationFrame/Default.html na urządzeniu HTC i nie jest obsługiwany !! – Solieman

+1

@Solieman Paul Irish ma świetny wpis na blogu z podkładką requestAnimationFrame: http://paulirish.com/2011/requestanimationframe-for-smart-animating/ – Jasper

+0

@Solieman kod, który podłączyłem (shim) dba o prawidłowe użycie metoda. Jeśli 'requestAnimationFrame' nie jest obsługiwany, automatycznie użyje jednej z pozostałych metod. Łącze Jaspera zawiera więcej informacji na ten temat. –

13
window.requestAnimFrame = function(){ 
    return (
     window.requestAnimationFrame  || 
     window.webkitRequestAnimationFrame || 
     window.mozRequestAnimationFrame || 
     window.oRequestAnimationFrame  || 
     window.msRequestAnimationFrame  || 
     function(/* function */ draw1){ 
      window.setTimeout(draw1, 1000/60); 
     } 
    ); 
}(); 
    window.requestAnimFrame(draw); 
})(); 

użycie tej funkcji dla wszystkich przypadków

+0

co robi '1000/60'? dlaczego nie tylko prosta figura wynikowa/oceniona? poza tym jest to skopiowane rozwiązanie z ['GitHub'] (https://gist.github.com/mrdoob/838785) bez przyznawania kredytów oryginalnemu plakatowi –