Ho una pagina che ha operazioni piuttosto pesanti (piuttosto pesanti) canvas
in corso. Per soddisfare gli utenti su dispositivi mobili e computer più vecchi pensavo che avrei potuto implementare un meccanismo che controllasse se l'elemento canvas è effettivamente visibile e decidere se i calcoli costanti e gli aggiornamenti canvas (animazione a 30fps) devono essere eseguiti o meno .I browser rendono gli elementi canvas che non si trovano all'interno del viewport?
Questo funziona perfettamente, ma quando eseguo un test delle prestazioni con Chrome Dev Tools ho notato che anche quando disattivo il controllo della visibilità e faccio in modo che le cose vengano sempre visualizzate, l'utilizzo della CPU della funzione in questione diminuisce un po ' quando nessuna parte degli elementi canvas è visibile (anche se in teoria dovrebbe comunque svolgere le stesse attività). Quindi: almeno sul mio computer con Chrome 17 non fa davvero la differenza se controllo la visibilità effettiva dell'elemento.
Per farla breve: ho bisogno di fare questo o i browser sono abbastanza intelligenti da gestire un caso del genere senza nemmeno dirlo (e posso salvare il controllo della visibilità)?
EDIT:
Così ho fatto qualche "ricerca" su questo argomento e costruito this fiddle.
Quello che succede è che si genera solo rumore a 30 fotogrammi al secondo. Non troppo piacevole alla vista ma, beh ... La parte superiore è solo un semplice div
per bloccare il viewport. Quando si scorre verso il basso e l'elemento canvas
nel Viewport CPU Usage mi dice che sta prendendo circa il 40%, quindi apparentemente il browser ha molto da fare qui. Quando faccio scorrere di nuovo verso l'alto in modo da avere solo il colore marrone rossastro div
nel mio viewport e profilo l'utilizzo della CPU scende a sth circa il 10%. Quando scorro verso il basso: l'utilizzo aumenta nuovamente.
Così, quando a implementare un controllo di visibilità come in questo modified fiddle, faccio vedere un aumento (una minuscola ad essere onesti) in utilizzo della CPU al posto di una goccia (in quanto ha il compito supplementare di verificare se la tela è all'interno del viewport).
Quindi mi sto ancora chiedendo se questo è un effetto collaterale di qualcosa di cui non sono a conoscenza (o sto facendo un grosso errore durante la profilazione) o se posso aspettarmi che i browser siano abbastanza intelligenti da gestire tali situazioni?
Se qualcuno potesse far luce su questo sarei molto grato!
Wow, grazie mille per questa risposta super completa! Ho sentito parlare di 'requestAnimationFrame', ma quello che mi ha sempre infastidito è che sembra mirare all'animazione a 60fps, non importa quale (cosa che penso sia troppo liscia per molti tipi di animazione). L'unico modo per limitarlo mi viene in mente di includere ancora una volta "setInterval" .... Sai se esiste un modo per limitarlo/modificarlo? – m90
troppo liscio? Non ho mai sentito di un'animazione troppo liscia, cosa c'è di sbagliato in questo? : S – AshleysBrain
Potrebbe sembrare strano, eppure ho un background nell'animazione classica, quindi penso davvero a 12fps, pensare come se fosse parte del mio cervello ormai. La mia obiezione potrebbe essere sciocca nel 95% dei casi, ma per alcuni casi sarebbe fantastico avere più controllo. – m90