Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

HTML5 SVG vs Canvas for big number of lines?

Question: Is canvas more suitable than svg in the following case?

Case: I'm drawing a chart (using d3js library) similar to this one (but with much more data):

http://mbostock.github.com/d3/talk/20111116/iris-parallel.html

It's based on an svg and it works fine for several thousands of lines (up to 5000), adding more lines (svg path) decreases the performance dramatically (scrolling in the page becomes slow)

Keep in mind: That I need to add mouse events (which is handy in svg)

like image 237
Ahmed Moawad Avatar asked Dec 19 '12 22:12

Ahmed Moawad


People also ask

Is canvas more performant than SVG?

The<canvas> element is a container for graphics. SVG gives better performance with smaller number of objects or larger surface. Canvas gives better performance with smaller surface or larger number of objects. SVG is vector based and composed of shapes.

What is the difference between Canvas and SVG in HTML5?

Differences Between SVG and CanvasCanvas draws 2D graphics, on the fly (with a JavaScript). SVG is XML based, which means that every element is available within the SVG DOM. You can attach JavaScript event handlers for an element. In SVG, each drawn shape is remembered as an object.

Is HTML5 canvas fast?

On the one hand, canvas was fast enough on simple functions like pencil drawing due to native implementation of basic drawing methods. On the other hand, when we implemented classic Flood Fill algorithm using Pixel Manipulation API we found that it is too slow for that class of algorithms.

What are the advantages of HTML5 draw a square using canvas?

Using canvas, we can learn how to draw essential and complex shapes, adding gradients, shadows, patterns, adjust colors and styles and can explore into more innovative techniques like rotating, scaling, and compositing objects. It is a low-level technical model informs a bitmap that does not have a built-in scene.


2 Answers

Generally svg is better suited for vector images, like in your example. However canvas has a lot of benefits in modern browsers such as hardware acceleration, so for drawing the lines, as long as zooming, panning ect. isn't required performance will be using canvas.

Mouse events can be a pain using canvas, since you have to manually keep track of everything, so with 5000+ points using canvas it wont be fun. The trade off however will be once the points are drawn, assuming you only draw them once the page will behave fine regardless of the number of lines, since they are all drawn to a raster image and aren't part of the DOM.

Honestly though the best way to find it is to test what you currently have using canvas.

like image 73
Loktar Avatar answered Sep 22 '22 01:09

Loktar


When performance becomes a problem, switching to canvas might be an option. In this case you can draw the canvas once. Afterwards it's pretty much treated like an image. Drawing might take some time, but afterwards it can be scaled pretty quickly. Note that it is possible to draw a rendered SVG to a canvas using the context.drawImage method (example). So you could keep your SVG generation code to create an SVG in the background, and then draw it to the canvas.

But keep in mind that it won't scale as beautiful as an SVG as soon as it is on the canvas. When the user zooms in, it will get blurry or pixely, depending on how the browser scales graphics.

Click events on canvas can be handled in two ways. Either keep an array of click targets, and add an onclick event handler to the canvas. When a click occurs, iterate the array and check which one is closest to the click coordinates.

The other option is to use hit regions. These have to be defined as polygonal paths.

like image 41
Philipp Avatar answered Sep 19 '22 01:09

Philipp