Ho una funzione che calcola il fotogramma successivo in un'animazione di vari oggetti che si muovono sia nell'asse X che nell'asse Y [lo chiamo frameRender()
] e una funzione che applica il fotogramma risultante agli oggetti [Io chiamo lo frameDisplay()
]. Gli oggetti non si spostano semplicemente dal punto A al punto B, si spostano costantemente, ricevendo sempre nuove coordinate obiettivo. Io uso un setInterval()
con un intervallo 1000/frameRate
ma non sembra funzionare affatto in quanto i browser non hanno tempi precisi.Come faccio a riprodurre un'animazione JavaScript alla stessa velocità su tutti i browser su tutti i sistemi?
La domanda è: come posso assicurarmi che l'animazione abbia una frequenza fotogrammi costante e funzionerà alla stessa velocità su tutti i browser, su tutti i sistemi? Ho provato tutto e non riesco a ottenere un risultato accurato anche su browser diversi (eseguo test su Firefox e Chrome, Chrome di solito visualizza molto più velocemente).
Il risultato dovrebbe essere: Quando viene riprodotto lentamente, l'intervallo di animazione dovrebbe diminuire a prima, e poi cercare di saltare alcuni fotogrammi [saltando frameDisplay()
] se il DOM visualizza lento, finché non viene riprodotto correttamente. Quando suona velocemente, l'intervallo di animazione dovrebbe aumentare, rendendo l'animazione riprodotta alla velocità corretta.
Ma come mantenere la coerenza in tutto questo, dal momento che non si può essere sempre sicuri quando i browser diventeranno lenti o quando si esibiranno velocemente. Per esempio, se c'è un enorme picco di movimenti, e diminuiamo l'intervallo per mantenere il frame rate costante, e poi improvvisamente la maggior parte degli oggetti in movimento si fermano o non si muovono molto, improvvisamente si esibiranno molto velocemente!
Qualche idea?
Quindi, in pratica, si intende che dovrei cambiare la matematica di rendering dei frame per includere una variabile delta, in modo da poter spostare ad esempio l'oggetto più o meno pixel X Y in base alla passata precedente? – stagas
@stagas: esattamente. In questo modo se un aggiornamento si trova a 50 ms e l'altro a 450 ms, la tua applicazione dovrebbe essere ancora al "segno dei 500 ms" se ottieni ciò che intendo. – Matt
Cool, proveremo subito grazie – stagas