Estoy moviendo 6000 elementos div pequeños en un experimento css3 usando una transición de top: 0
a top: 145px
para probar el rendimiento.
El uso de aceleración sin hardware funciona sin problemas en Google Chrome.
Si habilito la aceleración de hardware a través del translateZ(0)
rendimiento, se vuelve horrible.
¿Por qué es así?
Aquí está mi código de ejemplo: http://dl.dropboxusercontent.com/u/17844821/tmp/hwtest.html
Actualización (2014-11-13): dado que esta pregunta sigue atrayendo la atención, me gustaría señalar que el problema en sí parece existir, aunque es posible que la tartamudez mencionada ya no sea visible en la demostración proporcionada en el hardware moderno . Es posible que los dispositivos más antiguos sigan teniendo problemas de rendimiento.
Respuestas:
Siempre agrego:
-webkit-backface-visibility: hidden; -webkit-perspective: 1000;
Cuando se trabaja con transformación 3d. Incluso transformaciones 3D "falsas". La experiencia me dice que estas dos líneas siempre mejoran el rendimiento, especialmente en iPad pero también en Chrome.
Probé en su ejemplo y, por lo que puedo decir, funciona.
En cuanto a la parte del "por qué" de tu pregunta ... no lo sé. La transformación 3D es un estándar joven, por lo que la implementación es entrecortada. Por eso es una propiedad prefijada: para pruebas beta. Alguien podría completar un informe de error o una pregunta y hacer que el equipo investigue.
Edición del 19 de agosto de 2013 :
Hay actividad regular en esta respuesta, y acabo de perder una hora descubriendo que IE10 también necesita esto. Así que no olvides:
backface-visibility: hidden; perspective: 1000;
fuente
-webkit-transform: rotateZ(360deg);
dl.dropbox.com/u/17844821/zeug/hwtest2.html - ¡Esta vez la versión acelerada por hardware es más rápida! Si elimino la rotación, la aceleración del hardware ralentiza la animación. Si su teoría es cierta, entonces esto no debería funcionar (porque la única diferencia es que agreguérotateZ(360)
). Por otro lado, ¿quizás Chrome sea lo suficientemente inteligente como para darse cuenta de que para una rotación alrededor del eje Z no se requiere volver a dibujar la parte posterior de esos mosaicos?La razón por la que la animación era más lenta cuando agregó el truco de transformación nula (
translateZ(0)
) es que cada transformación 3D nula crea una nueva capa. Cuando hay demasiadas de estas capas, el rendimiento de la renderización se ve afectado porque el navegador necesita enviar muchas texturas a la GPU.El problema se notó en 2013 en la página de inicio de Apple, que abusó del truco de transformación nula. Ver http://wesleyhales.com/blog/2013/10/26/Jank-Busting-Apples-Home-Page/
El OP también notó correctamente la explicación en su comentario :
fuente
Interesante. He intentado jugar con algunas opciones
about:flags
, específicamente estas:Los habilitó, lo probé y falló estrepitosamente con la casilla de verificación habilitada (como lo hizo usted). Pero luego noté otra opción:
Dado lo destacado en la descripción de la bandera, especularía que la aceleración de hardware estaba, de hecho, activada para mí incluso sin la casilla de verificación marcada, ya que vi el contador de FPS con las opciones anteriores activadas.
TL; DR: la aceleración de hardware es, al final, una preferencia del usuario; forzarlo con dummy
translateZ(0)
introducirá una sobrecarga de procesamiento redundante dando la apariencia de un rendimiento más bajo.fuente
-webkit-transform: rotateZ(360deg);
dl.dropbox.com/u/17844821/zeug/hwtest2.html - ¡Esta vez la versión acelerada por hardware es más rápida! Si elimino la rotación, la aceleración del hardware ralentiza la animación.translateZ(0)
más lento querotateZ(360deg)
"translateZ(0)
SIEMPRE está activo. En realidad, se requiere para activar la aceleración 3D.rotateZ(360deg)
simplemente agrega adicionalmente la animación de rotación. Entonces, diría que la pregunta es: ¿Por qué la animación con aceleración de hardware 3D es más suave conrotateZ(360deg)
que sin?Verifique chrome: // flags en chrome. Dice
fuente
Mi experiencia es que las GPU generalmente no son más rápidas para todo tipo de gráficos. Para gráficos muy "básicos", pueden ser más lentos.
Es posible que haya obtenido un resultado diferente si estuviera rotando una imagen; ese es el tipo de cosas en las que las GPU son buenas
También considere que translateZ (0) es una operación en 3 dimensiones, mientras que cambiar arriba o izquierda es una operación bidimensional
fuente
translateZ(0)
en realidad no hace más que "activar" la aceleración de hardware 3D. Es un truco pero funciona. Al agregar ese atributo css, el elemento html seleccionado, así como todos los elementos secundarios, serán calculados a la fuerza por la GPU en lugar de la CPU.Los vi a los dos, creo que sé la razón por la que confundieron:
Arriba, solo una opinión personal, ¡gracias!
fuente