Skip to main content

HTML5 Canvas 优化描边性能提示

在 Konva 中绘制带有描边和阴影的形状时,会发生额外的内部绘制步骤。这是因为 Konva 需要确保描边的阴影被正确绘制。然而,这可能会影响性能,特别是处理许多形状时。

为了优化性能,您可以通过设置 shadowForStrokeEnabled(false) 来禁用描边阴影。当您不需要描边投影阴影时,这尤其有用。

下面是一个演示,展示了带和不带描边阴影的性能差异:

import Konva from 'konva';

const stage = new Konva.Stage({
  container: 'container',
  width: window.innerWidth,
  height: window.innerHeight,
});

const layer = new Konva.Layer();
stage.add(layer);

// 创建带有描边阴影的形状(默认)
const circleWithShadow = new Konva.Circle({
  x: 100,
  y: 100,
  radius: 50,
  fill: 'red',
  stroke: 'black',
  strokeWidth: 4,
  shadowColor: 'black',
  shadowBlur: 10,
  shadowOffset: { x: 5, y: 5 },
  shadowOpacity: 0.5,
});

// 创建不带描边阴影的形状(优化)
const circleOptimized = new Konva.Circle({
  x: 250,
  y: 100,
  radius: 50,
  fill: 'red',
  stroke: 'black',
  strokeWidth: 4,
  shadowColor: 'black',
  shadowBlur: 10,
  shadowOffset: { x: 5, y: 5 },
  shadowOpacity: 0.5,
  shadowForStrokeEnabled: false,
});

// 添加标签
const defaultLabel = new Konva.Text({
  x: 50,
  y: 170,
  text: '带描边阴影',
  fontSize: 16,
});

const optimizedLabel = new Konva.Text({
  x: 200,
  y: 170,
  text: '不带描边阴影\n(更好的性能)',
  fontSize: 16,
});

// 添加 FPS 计数器
const fpsText = new Konva.Text({
  x: 10,
  y: 10,
  text: 'FPS: 0',
  fontSize: 16,
});

layer.add(circleWithShadow);
layer.add(circleOptimized);
layer.add(defaultLabel);
layer.add(optimizedLabel);
layer.add(fpsText);

// 创建动画以演示性能
const anim = new Konva.Animation((frame) => {
  circleWithShadow.rotation(frame.time * 0.1);
  circleOptimized.rotation(frame.time * 0.1);
  
  // 更新 FPS 计数器
  fpsText.text('FPS: ' + frame.frameRate.toFixed(1));
}, layer);

anim.start();