¿Cuál es el mejor enfoque para crear elementos sobre la marcha y poder moverlos? Por ejemplo, supongamos que quiero crear un rectángulo, círculo y polígono y luego seleccionar esos objetos y moverlos.
Entiendo que HTML5 proporciona tres elementos que pueden hacer esto posible: svg , canvas y div . Para lo que quiero hacer, ¿cuál de esos elementos proporcionará el mejor rendimiento?
Para comparar estos enfoques, estaba pensando en crear tres páginas web visualmente idénticas que tengan un encabezado, pie de página, widget y contenido de texto. El widget en la primera página se crearía completamente con el canvas
elemento, el segundo completamente con el svg
elemento y el tercero con el div
elemento plano , HTML y CSS.
javascript
html
svg
html5-canvas
verdy
fuente
fuente
Respuestas:
La respuesta corta:
SVG sería más fácil para usted, ya que la selección y el desplazamiento ya están integrados. Los objetos SVG son objetos DOM, por lo que tienen controladores de "clic", etc.
Los DIV están bien pero son torpes y tienen una carga de rendimiento horrible en grandes cantidades.
Canvas tiene el mejor rendimiento sin dudas, pero debe implementar todos los conceptos de estado administrado (selección de objetos, etc.) usted mismo o usar una biblioteca.
La respuesta larga:
HTML5 Canvas es simplemente una superficie de dibujo para un mapa de bits. Se configura para dibujar (digamos con un color y grosor de línea), dibuja esa cosa, y luego el lienzo no tiene conocimiento de esa cosa: no sabe dónde está o qué es lo que acaba de dibujar, es solo píxeles Si desea dibujar rectángulos y hacer que se muevan o sean seleccionables, debe codificar todo desde cero, incluido el código para recordar que los dibujó.
SVG, por otro lado, debe mantener referencias a cada objeto que representa. Cada elemento SVG / VML que cree es un elemento real en el DOM. De forma predeterminada, esto le permite realizar un seguimiento mucho mejor de los elementos que crea y facilita el manejo de cosas como los eventos del mouse de manera predeterminada, pero se ralentiza significativamente cuando hay una gran cantidad de objetos
Esas referencias SVG DOM significan que parte del trabajo de pies para lidiar con las cosas que dibujas se hace por ti. Y SVG es más rápido cuando se procesan objetos realmente grandes , pero más lento cuando se procesan muchos objetos.
Un juego probablemente sería más rápido en Canvas. Un gran programa de mapas probablemente sería más rápido en SVG. Si desea utilizar Canvas, tengo algunos tutoriales sobre cómo poner en marcha objetos móviles y ejecutarlos aquí .
Canvas sería mejor para cosas más rápidas y manipulación de mapas de bits pesados (como la animación), pero tomará más código si desea mucha interactividad.
He corrido un montón de números en un dibujo hecho con HTML DIV versus un dibujo hecho en Canvas. Podría hacer una gran publicación sobre los beneficios de cada uno, pero daré algunos de los resultados relevantes de mis pruebas para considerar para su aplicación específica:
Hice páginas de prueba Canvas y HTML DIV, ambas tenían "nodos" móviles. Los nodos de lienzo eran objetos que creé y seguí en Javascript. Los nodos HTML eran Divs móviles.
Agregué 100,000 nodos a cada una de mis dos pruebas. Se desempeñaron de manera bastante diferente:
La pestaña de prueba de HTML tardó una eternidad en cargarse (cronometrado en poco menos de 5 minutos, Chrome le pidió que matara la página la primera vez). El administrador de tareas de Chrome dice que esa pestaña está ocupando 168MB. Toma 12-13% de tiempo de CPU cuando lo estoy mirando, 0% cuando no estoy mirando.
La pestaña Lienzo se cargó en un segundo y ocupa 30 MB. También ocupa el 13% del tiempo de CPU todo el tiempo, independientemente de si uno lo está mirando o no. (Edición 2013: en su mayoría lo han solucionado)
Arrastrar en la página HTML es más suave, lo que se espera del diseño, ya que la configuración actual es volver a dibujar TODO cada 30 milisegundos en la prueba de Canvas. Hay muchas optimizaciones para Canvas para esto. (la invalidación del lienzo es la más fácil, también las regiones de recorte, el rediseño selectivo, etc., solo depende de cuánto desee implementar)
No hay duda de que podría hacer que Canvas sea más rápido en la manipulación de objetos como los divs en esa simple prueba, y por supuesto mucho más rápido en el tiempo de carga. El dibujo / carga es más rápido en Canvas y también tiene mucho más espacio para optimizaciones (es decir, excluir cosas que están fuera de la pantalla es muy fácil).
Conclusión:
fuente
background-image
... Aunque puede hacer cosas similares en SVG / CanvasPara agregar a esto, he estado haciendo una aplicación de diagrama, e inicialmente comencé con lienzo. El diagrama consta de muchos nodos, y pueden hacerse bastante grandes. El usuario puede arrastrar elementos en el diagrama.
Lo que encontré fue que en mi Mac, para imágenes muy grandes, SVG es superior. Tengo una Retina MacBook Pro 2013 de 13 ", y ejecuta bastante bien el violín de abajo. La imagen es de 6000x6000 píxeles y tiene 1000 objetos. Una construcción similar en el lienzo era imposible de animar para mí cuando el usuario arrastraba objetos en el diagrama.
En las pantallas modernas también debe tener en cuenta diferentes resoluciones, y aquí SVG le ofrece todo esto de forma gratuita.
Violín: http://jsfiddle.net/knutsi/PUcr8/16/
Pantalla completa: http://jsfiddle.net/knutsi/PUcr8/16/embedded/result/
fuente
Conocer las diferencias entre SVG y Canvas sería útil para seleccionar la correcta.
Lona
SVG
fuente
Estoy de acuerdo con las conclusiones de Simon Sarris:
He comparado alguna visualización en Protovis (SVG) con Processingjs (Canvas) que muestra> 2000 puntos y Processingjs es mucho más rápido que Protovis.
Por supuesto, manejar eventos con SVG es mucho más fácil porque puede adjuntarlos a los objetos. En Canvas, debe hacerlo manualmente (verificar la posición del mouse, etc.) pero para una interacción simple no debería ser difícil.
También está la biblioteca dojo.gfx del kit de herramientas dojo. Proporciona una capa de abstracción y puede especificar el renderizador (SVG, Canvas, Silverlight). Esa también podría ser una opción viable, aunque no sé cuánta sobrecarga agrega la capa de abstracción adicional, pero facilita la codificación de interacciones y animaciones y es independiente del renderizador.
Aquí hay algunos puntos de referencia interesantes:
fuente
Solo mis 2 centavos con respecto a la opción divs.
Famous / Infamous y SamsaraJS (y posiblemente otros) usan divs no anidados absolutamente posicionados (con contenido HTML / CSS no trivial), combinados con matrix2d / matrix3d para posicionamiento y transformaciones 2D / 3D, y logran un 60FPS estable en hardware móvil moderado , entonces argumentaría en contra de que los divs sean una opción lenta.
Hay muchas grabaciones de pantalla en Youtube y en otros lugares, de material 2D / 3D de alto rendimiento que se ejecuta en el navegador, todo es un elemento DOM en el que puede inspeccionar el elemento , a 60FPS (mezclado con WebGL para ciertos efectos, pero no para el parte principal de la representación).
fuente
Si bien todavía hay algo de verdad en la mayoría de las respuestas anteriores, creo que merecen una actualización:
Con los años, el rendimiento de SVG ha mejorado mucho y ahora hay transiciones y animaciones CSS aceleradas por hardware para SVG que no dependen en absoluto del rendimiento de JavaScript. Por supuesto, el rendimiento de JavaScript también ha mejorado y, con él, el rendimiento de Canvas, pero no tanto como SVG. También hay un "nuevo chico" en el bloque que está disponible en casi todos los navegadores hoy y que es WebGL . Para usar las mismas palabras que Simon usó anteriormente: supera a Canvas y SVG . Sin embargo, esto no significa que deba ser la tecnología de acceso, ya que es una bestia con la que trabajar y solo es más rápida en casos de uso muy específicos.
En mi humilde opinión para la mayoría de los casos de uso de hoy, SVG ofrece la mejor relación rendimiento / usabilidad. Las visualizaciones deben ser realmente complejas (con respecto al número de elementos) y realmente simples al mismo tiempo (por elemento) para que Canvas y aún más WebGL realmente brillen.
En esta respuesta a una pregunta similar , proporciono más detalles, por qué creo que la combinación de las tres tecnologías a veces es la mejor opción que tiene.
fuente
layers.acceleration.force-enabled
en Firefox no se trata de decodificación de video. Es un hecho bien conocido. Cuando finaliza los bucles con requestAnimationFrame, hay otro nivel que permite muchas más repeticiones. No se trata del video en absoluto.Para sus propósitos, le recomiendo usar SVG, ya que obtiene eventos DOM, como el manejo del mouse, que incluye arrastrar y soltar, no tiene que implementar su propio redibujo, y no tiene que realizar un seguimiento del estado de tus objetos Use Canvas cuando tenga que manipular imágenes de mapa de bits y use un div regular cuando quiera manipular cosas creadas en HTML. En cuanto al rendimiento, encontrará que los navegadores modernos ahora están acelerando los tres, pero ese lienzo ha recibido la mayor atención hasta ahora. Por otro lado, qué tan bien escribes tu javascript es crítico para obtener el máximo rendimiento con el lienzo, por lo que aún recomiendo usar SVG.
fuente
Mientras busco en Google, encuentro una buena explicación sobre el uso y la compresión de SVG y Canvas en http://teropa.info/blog/2016/12/12/graphics-in-angular-2.html
Espero eso ayude:
fuente