2012-01-30 11 views
13

Ci sono tonnellate di pagine web in questi giorni raccomandando di aggiungere queste regole al suo sito web per renderlo accelerazione hardware:Perché i browser non sono sufficientemente intelligenti per accelerare l'hardware senza trucchi?

transform: translate3d(0,0,0); 
-webkit-transform: translate3d(0,0,0); 

Questo sempre colpito me come ridicolo. Perché il browser dovrebbe aver bisogno del mio aiuto per decidere di accelerare l'hardware? Sarà più veloce, giusto? Quindi, perché non farlo? Perché mi aspetti "ingannare" il browser in esso?


Un altro modo di fare questa domanda potrebbe essere, perché non ogni linea di base/reset foglio di stile includono le linee

* { 
    transform: translate3d(0,0,0); 
    -webkit-transform: translate3d(0,0,0); 
} 
+0

La prima volta che ho visto una tale tecnica era in [questa domanda] (http: // StackOverflow.it/questions/9012753/is-there-a-firefox-equivalent-to-chromes-translatez0-to-force-gpu-accelera), con una bella risposta "nope" da parte di uno degli sviluppatori di Mozilla. È * quasi * ridicolo come aggiungere "! Important" per risolvere un enigma di specificità ... * quasi *. – BoltClock

risposta

25

E 'non è tanto che i browser non possono essere o non sono intelligenti abbastanza da usare l'accelerazione hardware. Invece, ciò a cui ti riferisci si applica solo a WebKit e, in particolare, alle versioni mobili di WebKit. Sia Firefox che IE accelerano l'hardware, e dividono automaticamente la pagina in "strati" che sono composti sulla GPU. Ecco perché di solito superano Chrome al rendering dei test di velocità. WebKit, d'altra parte, non è mai stato adattato per avere più di semplici accelerazioni di livello.

Perché Firefox e IE possono sfruttare il rendering di Direct2D su piattaforme Windows (in cui ogni singola operazione di disegno è accelerata dall'hardware), era essenzialmente un requisito che fossero in grado di eseguire anche il compositing con accelerazione hardware. Se avessero solo accelerato le operazioni di disegno e non il compositing, avrebbero perso la maggior parte del vantaggio in termini di velocità dall'uso di Direct2D in primo luogo perché avrebbe richiesto la copia tra GPU e memoria di sistema, che è lenta. D'altra parte, tutti i backend di rendering di WebKit di cui sono a conoscenza eseguono il rendering completamente nel software e sostengono la penalità copy-to-GPU quando si compongono (se si utilizza il composito GPU). Quindi, finisce per essere un compromesso. Se il livello di compositing non richiede molto tempo per il rendering sulla CPU, non ha sempre senso eseguire la copia e il composito sulla GPU.

A causa di questo, e anche per la natura estremamente limitata delle GPU mobili, nessuno dei browser WebKit ha ancora iniziato a fare l'accelerazione hardware automatica tranne quando è assolutamente necessario (ad esempio quando si imposta una trasformazione 3D). Se volessi la mia opinione, aggiungerei anche che penso che anche la pigrizia da parte degli sviluppatori WebKit e delle società di supporto sia un fattore importante. L'uso della GPU è una delle principali fonti di bug, quindi è più facile per loro non utilizzarlo invece di risolvere i problemi.

A proposito, Firefox per Android può fare sempre il compositing su GPU, anche se potresti doverlo abilitare in about: config; Non so se è attivo per impostazione predefinita. Per PC, ti consiglio di utilizzare Firefox o IE per un rendering veramente veloce.

EDIT: Dovrei aggiungere che nelle ultime versioni di Android, Google ha aggiunto l'accelerazione hardware a Skia, che gestisce quasi tutto il rendering 2D sul sistema operativo. Non ci sono ancora molti dispositivi in ​​circolazione, ma ciò significa che le prestazioni miglioreranno per tutto su Android nel prossimo futuro. Detto questo, non so se la loro implementazione di Skia funzioni perfettamente con OpenGL come potrebbe piacerci. Il compositing potrebbe ancora incorrere in alcune copie extra fino a quando non si occupano di esso.

+0

Wow, ottima risposta; grazie. Lascerò questo tempo un po 'più lungo per vedere se qualcuno può fornire ulteriori informazioni sul lato WebKit delle cose, ma questo è molto apprezzato. – Domenic

+3

Questa risposta contiene alcuni fraintendimenti. "non è mai stato veramente adattato per avere più di semplici accelerazioni di strati" è semplicemente sbagliato. A causa dell'approccio alla piattaforma di astrazione di WebKit (vedi http://ariya.ofilabs.com/2011/06/your-webkit-port-is-special-just-like-every-other-port.html), l'accelerazione del primitivo il disegno è delegato allo stack grafico della piattaforma. Su Mac, CoreGraphics sfrutta la GPU in una certa misura. Anche sulla porta Qt WebKit, ci sono scelte da OpenVG, OpenGL, OpenGL ES, ecc. Per accelerare il disegno. –

+0

È vero che per la maggior parte delega il disegno sulla piattaforma, ma nessuno degli stack grafici della piattaforma utilizza molta accelerazione hardware al momento ad eccezione di Direct2D su Windows. CoreGraphics fa solo un'accelerazione semplice per il blitting e così via, e cose complicate come il testo non sono affatto accelerate. Ho parlato della nuova versione di Android di Skia in una modifica sopra. La porta Qt non è utilizzata da nessuna delle principali implementazioni del browser di cui sono a conoscenza, e mentre usare OpenVG sarebbe grandioso, non ci sono molte implementazioni funzionanti. –

1

Per ulteriori informazioni sull'approccio webkit, Ariya Hidayat (recensore di siti Web) ha scritto un numero pretty good introductory blog post on hardware acceleration and webkit per il nostro blog. Godere.

[La battuta finale è che l'accelerazione hardware in grado di masticare un sacco di memoria, in modo da essere giudizioso.]

+0

Gli ultimi due paragrafi sono stati particolarmente illuminanti. Grazie! – Domenic

Problemi correlati