跳到主要内容

HTML5 Canvas 禁用监听性能技巧

如果 Canvas 上有大量图形,并且部分图形不需要检测事件, 可以将 listening 设置为 false 以提高性能。

listening = false 时,事件检测会忽略该图形,例如 mouseover、拖放和 click 等事件。 这可以明显提高复杂应用的性能。

以下示例展示了启用监听和禁用监听的图形之间的性能差异:

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);

// Create many circles with listening enabled
for (let i = 0; i < 100; i++) {
  const circle = new Konva.Circle({
    x: Math.random() * stage.width(),
    y: Math.random() * stage.height(),
    radius: 20,
    fill: 'blue',
    opacity: 0.5,
    // Enable event detection (default)
    listening: true,
  });
  
  // Add hover effect
  circle.on('mouseover', function() {
    this.fill('red');
  });
  
  circle.on('mouseout', function() {
    this.fill('blue');
  });
  
  layer.add(circle);
}

// Create many circles with listening disabled
for (let i = 0; i < 1000; i++) {
  const circle = new Konva.Circle({
    x: Math.random() * stage.width(),
    y: Math.random() * stage.height(),
    radius: 20,
    fill: 'green',
    opacity: 0.5,
    // Disable event detection for better performance
    listening: false,
  });
  layer.add(circle);
}

// Add text explanation
const text = new Konva.Text({
  x: 10,
  y: 10,
  text: 'Blue circles (100) have event listeners (hover them)\nGreen circles (1000) have no listeners (better performance)',
  fontSize: 16,
  fill: 'black',
});
layer.add(text);