2012-12-18 15 views
18

Per giochi HTML5, con animazione canvas per dispositivi mobili.setTimeout o setInterval o requestAnimationFrame

Sono di fronte a problemi di prestazioni che differiscono dalla velocità tra ciascun dispositivo e gli altri.

requestAnimationFrame velocizza l'animazione del gioco in base alla velocità del dispositivo.
setInterval mi ha scioccato che ci sia un ritardo da un dispositivo a un altro.
setTimeout è anche lento il disegno su tela.

Chi ha avuto un'esperienza precedente con i giochi HTML5 Mobile può guidarmi a lanciare il modo migliore di tre di essi (o altre tecniche se disponibili) per sviluppare animazioni su tela essere stabili su diversi dispositivi mobili?

risposta

19

Utilizzare sempre requestAnimationFrame quando possibile, poiché è ciò per cui è destinato. È meglio per use a shim for support quando non lo è, quindi non è necessario occuparsi dei dettagli specifici.

Per consentire all'animazione o alla logica di gioco di eseguire alla stessa velocità nonostante il metodo utilizzato, è necessario utilizzare l'animazione basata sul tempo e calcoli basati sul tempo per la fisica o simili.

+0

Le vecchie versioni sul browser del telefono Android non supporta requestAnimationFrame (HTC) .... provo questo sito http://ie.microsoft.com/testdrive /Graphics/RequestAnimationFrame/Default.html sul dispositivo HTC e NON è supportato !! – Solieman

+1

@Solieman Paul Irish ha un ottimo post sul blog con una richiestaAnimationFrame shim: http://paulirish.com/2011/requestanimationframe-for-smart-animating/ – Jasper

+0

@Solieman il codice che ho collegato (lo shim) si occupa dell'utilizzo corretto metodo. Se 'requestAnimationFrame' non è supportato, utilizzerà automaticamente uno degli altri metodi. Il link di Jasper ha più informazioni su di esso. –

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); 
})(); 

uso questa funzione per tutti i casi

+0

cosa fa il '1000/60'? perché non solo una semplice figura risultante/valutata? e a parte questa è una soluzione copiata da ['GitHub'] (https://gist.github.com/mrdoob/838785) senza dare crediti al poster originale –

Problemi correlati