G
G copied to clipboard
canvas 渲染器在设置 enableRenderingOptimization: true 时,Group 上设置的 clipPath 没有生效
问题描述
- 创建一个
Group图元,在它下面挂载一个Rect图元 - 给
Group图元设置一个矩形的clipPath - 使用 canvas 渲染器进行渲染,在设置
enableRenderingOptimization: true时,可以观察到裁剪没有生效
复现地址:https://stackblitz.com/edit/react-j9yrujub?file=index.js,index.html
经测试使用 svg 渲染器,和不开启 enableRenderingOptimization 的 canvas 渲染时,一切正常。
如果直接把 clipPath 设置在 rect 上,结果也一切正常。
G 的官方文档似乎没有提到 enableRenderingOptimization 这个属性,我从 其他 issue 中了解到该选项,自己测试时确实有明显的性能提升,不知使用方式是否正确?
测试代码
import { Canvas, CanvasEvent, Rect, Group } from '@antv/g';
import { Renderer as CanvasRenderer } from '@antv/g-canvas';
const canvasRenderer = new CanvasRenderer({
enableRenderingOptimization: true, // 关闭后裁剪正常生效
});
const canvas = new Canvas({
container: 'container',
width: 600,
height: 500,
renderer: canvasRenderer,
});
const group = new Group();
const rect = new Rect({
style: {
x: 150,
y: 150,
width: 200,
height: 100,
fill: 'red',
stroke: 'black',
},
});
const clipPath = new Rect({
style: {
x: 100,
y: 100,
width: 200,
height: 100,
stroke: 'black',
},
});
canvas.addEventListener(CanvasEvent.READY, () => {
canvas.appendChild(group);
group.appendChild(rect);
canvas.appendChild(clipPath);
group.style.clipPath = clipPath;
// rect.style.clipPath = clipPath; // 直接把裁剪设置在 rect 上时,一切正常
// 简单的偏移就能看出效果,不需要动画
// rect.animate(
// [{ transform: 'translateX(200)' }, { transform: 'translateX(-400)' }],
// { duration: 3000 }
// );
});
版本信息
@antv/g: 6.1.21 @antv/g-canvas: 2.0.40
你自己测试来看,开启后,性能提升有多少?
enableRenderingOptimization 这个会开启批量渲染策略,细节上还没有经过充分的测试,可以评估看看性能提升有多大,clipPath 这个应该是策略实现过程中没有考虑到这个 case 导致的
仅从帧数的角度上来 差异还是挺大的 50%左右了
仅从帧数的角度上来 差异还是挺大的 50%左右了
可以看看一些实际业务场景的性能基准