HTML5 Canvas 形状缓存性能提示

HTML5 Canvas 形状缓存性能提示

一种显著提高复杂 Konva 形状绘制性能的方法是将它们缓存为图像。
这可以通过使用 cache() 方法将一个节点转换为图像对象来实现。

本教程绘制 10 个缓存的星星,而不是绘制 10 个单独的星星,绘制性能提高了大约 4 倍。缓存可以应用于图层、组和形状。

注意:cache() 方法要求图像托管在与执行代码相同域的 Web 服务器上。

缓存是如何工作的?

当你调用 cache() 方法时,Konva 在内存中创建一个新的画布元素并在其上绘制节点。下次,当图层被重绘时,Konva 只需绘制缓存的画布元素,而不需要再次绘制节点本身。如果你更改了形状的不透明度或变换(位置、旋转、缩放),则无需重新缓存该形状。在其他情况下,你可能需要手动重新缓存该形状。基于上述逻辑,关于缓存有几条推荐:

  1. 尽量不要单独缓存很多形状。缓存一组形状更好。
  2. 尽量不要缓存经常变化的形状。缓存静态形状更好。
  3. 不建议缓存简单形状,如矩形。缓存具有多种样式的复杂形状更好。在缓存之前和之后测量性能,以查看是否值得。
  4. 你可以使用 pixelRatio 属性来提高或降低缓存图像的质量。降低质量将提高性能。
Konva Shape Caching Demoview raw
<!DOCTYPE html>
<html>
<head>
<script src="https://unpkg.com/konva@9.3.18/konva.min.js"></script>
<meta charset="utf-8" />
<title>Konva Shape Caching Demo</title>
<style>
body {
margin: 0;
padding: 0;
overflow: hidden;
background-color: #f0f0f0;
}
</style>
</head>
<body>
<div id="container"></div>
<script>
var width = window.innerWidth;
var height = window.innerHeight;

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

var layer = new Konva.Layer();

var star = new Konva.Star({
innerRadius: 20,
outerRadius: 50,
fill: 'red',
stroke: 'black',
strokeWidth: 5,
numPoints: 5,
x: 60,
y: 60,
draggable: true,
shadowOffset: { x: 5, y: 5 },
shadowColor: 'black',
shadowBlur: 5,
shadowOpacity: 0.5,
shadowForStrokeEnabled: false,
});

layer.add(star);
stage.add(layer);
star.cache();

var clone;
for (var n = 0; n < 10; n++) {
clone = star.clone({
x: Math.random() * stage.width(),
y: Math.random() * stage.height(),
});
clone.cache();
layer.add(clone);
}
</script>
</body>
</html>