2012-01-30 12 views
13

hay un montón de páginas web en estos días que recomiendan se añaden estas reglas a su contenido para que sea acelerado por hardware:¿Por qué los navegadores no son lo suficientemente inteligentes como para acelerar el hardware sin trucos?

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

Esto siempre me pareció ridícula. ¿Por qué debería el navegador necesitar mi ayuda para decidir acelerar el hardware? Va a ser más rápido, ¿verdad? Entonces, ¿por qué no solo hacerlo? ¿Por qué esperar a que "engaño" al navegador?


Otra forma de hacer esta pregunta podría ser, ¿por qué no todos los línea de base/reset de estilos incluyen las líneas

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

La primera vez que vi esta técnica estaba en [esta cuestión] (http: // stackoverflow.com/questions/9012753/is-there-a-firefox-equivalent-to-chromes-translatez0-to-force-gpu-accelera), con una agradable respuesta "nope" por uno de los desarrolladores de Mozilla. Es * casi * tan ridículo como agregar '! Important' para resolver un enigma de especificidad ... * casi *. – BoltClock

Respuesta

25

No es tanto que los navegadores no pueden ser o no son inteligentes suficiente para usar hardware-aceleración. En cambio, a lo que se refiere solo se aplica realmente a WebKit, y especialmente a las versiones móviles de WebKit. Tanto Firefox como IE aceleran todo y dividen automáticamente la página en "capas" compuestas en la GPU. Es por eso que generalmente soplan sobre Chrome en las pruebas de velocidad de renderizado. WebKit, por otro lado, nunca ha sido adaptado para tener más que aceleración de capas simples.

Dado que Firefox e IE pueden aprovechar el renderizado de Direct2D en las plataformas de Windows (donde cada operación de dibujo se acelera por hardware), era esencialmente un requisito que también pudieran hacer composiciones aceleradas por hardware. Si solo hubieran acelerado las operaciones de dibujo y no la composición, habrían perdido la mayor parte de la ventaja de velocidad al usar Direct2D en primer lugar porque habría requerido copiar entre la GPU y la memoria del sistema, que es lenta. Por otro lado, todos los back-ends de renderizado de WebKit de los que tengo conocimiento realizan una renderización completa en el software e incurren en la penalización de copiar a la GPU cuando se combinan (si se usa la composición de la GPU). Entonces, termina siendo una compensación. Si la capa que está componiendo no tarda mucho tiempo en renderizarse en la CPU, no siempre tiene sentido realizar la copia y el compuesto en la GPU.

Debido a esto, y también a la naturaleza extremadamente limitada de las GPU móviles, ninguno de los navegadores WebKit ha comenzado a acelerar automáticamente el hardware, excepto cuando es absolutamente necesario (por ejemplo, al configurar una transformación 3D). Si querías mi opinión, también agregaría que creo que la pereza por parte de los desarrolladores de WebKit y las compañías de apoyo es un factor aquí también. El uso de la GPU es una fuente importante de errores, por lo que es más fácil para ellos simplemente no usarlo en lugar de solucionar los problemas.

Por cierto, Firefox para Android puede hacer composiciones de GPU todo el tiempo, aunque es posible que tenga que habilitarlo en about: config; No sé si está activado por defecto. Para PC, recomendaría usar Firefox o IE para una renderización realmente rápida.

EDITAR: También debo agregar que en las últimas versiones de Android, Google ha agregado aceleración de hardware a Skia, que maneja casi todo el renderizado 2D en el sistema operativo. No hay muchos dispositivos en la naturaleza que tengan esto todavía, pero sí significa que el rendimiento mejorará para todo en Android en el futuro cercano. Dicho esto, no sé si su implementación de Skia funciona tan bien con OpenGL como queramos. La composición aún puede incurrir en algunas copias adicionales hasta que se ocupen de ello.

+0

Guau, excelente respuesta; gracias. Dejaré esto abierto un rato más para ver si alguien puede proporcionar más información sobre el lado de WebKit, pero esto es muy apreciado. – Domenic

+3

Esta respuesta contiene algunos malentendidos. "Nunca se ha adaptado realmente para tener más que simple aceleración de capas" es simplemente incorrecto. Debido al enfoque de abstracción de la plataforma de WebKit (ver http://ariya.ofilabs.com/2011/06/your-webkit-port-is-special-just-like-every-other-port.html), la aceleración de la primitiva el dibujo se delega a la pila de gráficos de la plataforma. En Mac, CoreGraphics aprovecha la GPU en cierta medida. Incluso en el puerto Qt WebKit, hay opciones de OpenVG, OpenGL, OpenGL ES, etc. para la aceleración del dibujo. –

+0

Es cierto que en su mayoría delega el dibujo en la plataforma, pero ninguna de las pilas de gráficos de la plataforma usa mucha aceleración de hardware actualmente, excepto Direct2D en Windows. CoreGraphics solo hace una aceleración simple para blitting y cosas así, y cosas complicadas como el texto en realidad no se aceleran en absoluto. Hablé sobre la nueva versión de Skia de Android en una edición anterior. El puerto Qt no es utilizado por ninguna de las principales implementaciones de navegador del que soy consciente, y si bien usar OpenVG sería genial, tampoco hay muchas implementaciones operativas de eso. –

1

Para obtener más información sobre el enfoque de webkit, Ariya Hidayat (revisor de webkit) escribió un pretty good introductory blog post on hardware acceleration and webkit para nuestro blog. Disfrutar.

[El remate es que HW aceleración puede masticar mucha memoria, así que sea prudente.]

+0

Los últimos dos párrafos fueron especialmente esclarecedores. ¡Gracias! – Domenic

Cuestiones relacionadas