HTML5 Canvas Layer Management Performance Tip


When creating Konva applications, the most important thing to consider,
in regards to performance, is layer management. One of the things that makes
Konva stand out from other canvas libraries is that it enables us to create
individual layers, each with their own canvas elements. This means that we can
animate, transition, or update some stage elements, while not redrawing others.
If we inspect the DOM of a Konva stage, we’ll see that there is actually one
canvas element per layer.

This tutorial has two layers, one layer that’s animated, and another static layer
that contains text. Since there’s no reason to continually redraw the text, it’s placed in its own layer.

Note: Do not create too many layers. Usually 3-5 is max.

Konva Layer Management Demoview raw
<!DOCTYPE html>
<script src=""></script>
<meta charset="utf-8" />
<title>Konva Layer Management Demo</title>
body {
margin: 0;
padding: 0;
overflow: hidden;
background-color: #f0f0f0;
<div id="container"></div>

var width = window.innerWidth;
var height = window.innerHeight;

var stage = new Konva.Stage({
container: 'container',
width: width,
height: height
var animLayer = new Konva.Layer();
var staticLayer = new Konva.Layer();

* leave center point positioned
* at the default which is at the center
* of the hexagon

var blueHex = new Konva.RegularPolygon({
x: 50,
y: stage.height() / 2,
sides: 6,
radius: 40,
fill: '#00D2FF',
stroke: 'black',
strokeWidth: 4,
draggable: true

var yellowHex = new Konva.RegularPolygon({
x: stage.width() / 2,
y: stage.height() / 2,
sides: 6,
radius: 30,
fill: 'yellow',
stroke: 'black',
strokeWidth: 4,
draggable: true

* move center point to right side
* of hexagon
var redHex = new Konva.RegularPolygon({
x: 250,
y: stage.height() / 2,
sides: 6,
radius: 30,
fill: 'red',
stroke: 'black',
strokeWidth: 4,
offset: {
x: 30,
y: 0
draggable: true

var text = new Konva.Text({
x: 10,
y: 10,
text: 'Static Layer',
fontSize: '30',
fontFamily: 'Calibri',
fill: 'black'


animLayer.add(blueHex, yellowHex, redHex);
stage.add(animLayer, staticLayer);

var period = 2000;
var anim = new Konva.Animation(function(frame) {
var scale = Math.sin((frame.time * 2 * Math.PI) / period) + 0.001;
// scale x and y
blueHex.scale({ x: scale, y: scale });
// scale only y
// scale only x
}, animLayer);