HTML5 Canvas 形状缓存性能提示
一种显著提高复杂 Konva 形状绘制性能的方法是将它们缓存为图像。
这可以通过使用 cache()
方法将一个节点转换为图像对象来实现。
本教程绘制 10 个缓存的星星,而不是绘制 10 个单独的星星,绘制性能提高了大约 4 倍。缓存可以应用于图层、组和形状。
注意:cache()
方法要求图像托管在与执行代码相同域的 Web 服务器上。
缓存是如何工作的?
当你调用 cache()
方法时,Konva 在内存中创建一个新的画布元素并在其上绘制节点。下次,当图层被重绘时,Konva 只需绘制缓存的画布元素,而不需要再次绘制节点本身。如果你更改了形状的不透明度或变换(位置、旋转、缩放),则无需重新缓存该形状。在其他情况下,你可能需要手动重新缓存该形状。基于上述逻辑,关于缓存有几条推荐:
- 尽量不要单独缓存很多形状。缓存一组形状更好。
- 尽量不要缓存经常变化的形状。缓存静态形状更好。
- 不建议缓存简单形状,如矩形。缓存具有多种样式的复杂形状更好。在缓存之前和之后测量性能,以查看是否值得。
- 你可以使用
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>
|