2011-01-30 17 views
19

tengo una imagen y se mueven alrededor de mi página Web (JavaScript) así:Rendimiento de imagen en movimiento en la página web a través de CSS vs HTML5 Canvas

satelliteImage.style.top = coordinates.top + "px"; 
satelliteImage.style.left = coordinates.left + "px"; 

Por desgracia, el rendimiento es bastante mala en todos los navegadores excepto Cromo. El cuello de botella es la velocidad de renderizado. No tengo esperanzas para IE, pero quiero mejorar Firefox al menos. ¿Alguien tiene experiencia con el rendimiento de HTML5 Canvas mientras mueve una imagen, en comparación con el cambio de estilo?

Respuesta

52

He creado pruebas equivalentes para comparar las tasas de fotogramas para mover una imagen mediante CSS en lugar de dibujarla en un lienzo HTML. Aquí están las pruebas:

Y aquí están the FPS results (ver URL para obtener detalles de la prueba):

 
        Image Image Sprite Sprite 
     Browser Canvas CSS Canvas  CSS 
---------------------------------------------- 
    Safari v5.0.3  59  95  59  89 
Firefox v3.6.13  59  95  60  90 
Firefox v4.0b8  75  89  78  82 
    Chrome v8.0  108 230  120  204 
    iPad, Horiz  17  44  2  14 
    iPad, Vert  4  75  2  15 

Como se puede ver:

  1. Uno siempre va a obtener mejores resultados en movimiento una imagen como un elemento HTML que volver a dibujar una porción de la tela, y
  2. Eres probable posiblemente haciendo algo mal si solo obtiene 5 fps.

Editar: Se agregaron pruebas para mover 20 pequeños sprites animados sobre un fondo. Las conclusiones son las mismas

+0

+1 para la prueba objetiva =) –

+0

Gracias por la buena prueba Phrogz. Lamentablemente, no hago nada malo. Cuando la imagen de fondo se carga, por ejemplo, la velocidad de cuadros cae drásticamente. Ni siquiera muevo la imagen sobre ella, sino sobre una imagen completamente diferente que está en la parte superior del fondo. Ambos son PNG con mucha transparencia, texto con sombras, sombras de recuadro, esquinas redondeadas, etc. Hiciste tu prueba en las circunstancias perfectas. Sin embargo, demuestra el punto muy claramente. ¡Gracias de nuevo! –

+0

Pensé en algo que podría estar haciendo mal. Utilizo coordenadas negativas para llevar el objeto fuera de su área principal. Recuerdo que tuve problemas de procesamiento con algunos navegadores al hacer esto. ¿Estoy en el camino correcto? Voy a probar esto hoy. –

2

En mi experiencia con Canvas deberías poder obtener buenos 50 fps en Firefox e incluso unos buenos 15 fps en iOS. IE9 probablemente sea el navegador más rápido, otras versiones realmente no implementan Canvas.

+0

Gracias! ¿Cuál sería la forma más rápida de mover una imagen en un lienzo? –

+0

@ avok00 La única manera de mover una imagen en un lienzo es borrar el rect donde estaba la imagen y usar 'drawImage()' para dibujarla nuevamente. Sospecho que tu rendimiento será significativamente peor con esto, que simplemente mover una imagen en el DOM, sin embargo. – Phrogz

+0

Hmm, entonces ¿qué es esto de 50fps? ¿Tal vez puedo usar translate para mover todo el lienzo y lograr un mejor rendimiento? –

8

Han pasado más de 2 años y decidí realizar estas pruebas para ver si esto sigue siendo cierto. Lo hace ... y no es así.

  1. Firefox de escritorio y móviles ambas animaciones CSS plazo significativamente más rápido que el lienzo.

  2. Chrome escritorio se ejecuta lona y CSS animaciones sobre el mismo

  3. Chrome para dispositivos móviles (en Nexus 7) hace exactamente lo contrario: Lona corre mucho más rápido que el CSS!

(El uso de Firefox para Android con Nexus 7 y de escritorio navegadores en Linux con una resolución de 1920x1080)

 

Browser/OS   Canvas Image CSS IMage Canvas Sprites CSS Sprites  
-----------   ------------ ---------- -------------- ----------- 
Firefox 16   56.7fps  215.6 fps 59.2fps   203.6fps 
Firefox 16 Android 17.1 fps  179.6fps 11.5fps   35.7 
Chrome 22   192.3fps  223.5fps 170.1fps   164.3fps 
Chrome Android  48.3fps  39.9fps  92.8fps   13.1fps 

¿Qué todo el mundo obtiene? ¿Alguien puede probar IE9, 10 para esto?

+0

acabo de ejecutar la prueba en firefox 21, en un sistema ubuntu. Obtengo alrededor de 220 fps para cada prueba, excepto para CSS Sprites, que en realidad desciende a alrededor de 120 fps. – Spider

3

pensé que podría actualizar esta vieja cuestión con mis resultados en una tercera generación de iPad: gana

lienzo 2: 1 con el sprite animaciones un promedio de alrededor de 120 cuadros por segundo con un fondo más claro activarse en ambos sentidos. CSS apenas podía cumplir 60 fps.

En cuanto a la imagen individual, CSS fue definitivamente más rápido.

+0

vale la pena mirar mi respuesta a continuación, en cuanto a por qué esto puede ser ... y potencialmente más como para resultados de pruebas similares. –

0

Además de los hallazgos de MyNameIsKo sobre el rendimiento del iPad 3. Me preguntaba si tenía que ver con el hecho de que el método CSS DOM tenía que preocuparse por dibujar en la pantalla Retina del iPad 3, mientras que el lienzo se dibujaría a una resolución más baja y luego pasaría a la pantalla. ¡Un iPad 1 es significativamente más rápido para las actualizaciones de CSS que el iPad3!

También realicé algunos cambios en el canvas javascript para poder dibujar en un lienzo de resolución de retina. Agregué el siguiente código después de canv.height = h; en la función bg.onload:

if (window.devicePixelRatio) { 
    ctx.canvas.style.width = w + "px"; 
    ctx.canvas.style.height = h + "px"; 
    ctx.canvas.height = h * window.devicePixelRatio; 
    ctx.canvas.width = w * window.devicePixelRatio; 
    ctx.scale(window.devicePixelRatio, window.devicePixelRatio); 
} 

que hizo una enorme reducción en el rendimiento ...

iPad 1 (iOS 5.5.1)

iPad 3 (iOS 6.1.3)

     CSS Sprite  Canvas Sprites 
----------------------------------------------------- 
iPad 1     90     100 
iPad 3     55     120 
iPad 1(canvas changes) n/a     100 
iPad 3(canvas changes) n/a     35 
Cuestiones relacionadas