OptimizeViewportTransform 优化视口变换
阅读时间约 5 分钟
OptimizeViewportTransform 是 G6 中用于提升大规模图表交互性能的内置交互。
该交互通过实现选择性渲染策略,在视口变换过程中(即用户进行拖拽、缩放、滚动等操作时)临时隐藏非关键视觉元素,从而显著降低渲染计算负载,提高帧率和响应速度。当视口变换操作结束后,系统会在设定的延迟时间后自动恢复所有元素的可见性,确保完整的视觉呈现。
此交互基于 事件系统 实现,通过监听 GraphEvent.BEFORE_TRANSFORM
和 GraphEvent.AFTER_TRANSFORM
事件,精确捕捉视口变换的开始和结束时机,进而执行元素可见性的动态控制。因此,必须与视口操作类交互(如 drag-canvas
、zoom-canvas
或 scroll-canvas
)配合使用才能发挥作用。
这一交互主要用于:
在图配置中添加这一交互:
// 使用默认配置const graph = new Graph({// 其他配置...behaviors: ['optimize-viewport-transform'], // 直接添加,使用默认配置});// 或使用自定义配置const graph = new Graph({// 其他配置...behaviors: [{type: 'optimize-viewport-transform',debounce: 300, // 设置更长的防抖时间key: 'optimize-behavior', // 为交互指定标识符,方便动态更新},],});
配置项 | 说明 | 类型 | 默认值 | 必选 |
---|---|---|---|---|
type | 交互类型名称 | string | optimize-viewport-transform | ✓ |
enable | 是否启用该交互 | boolean | ((event: Event) => boolean) | true | |
debounce | 操作结束后多长时间恢复显示所有元素(毫秒) | number | 200 | |
shapes | 指定在操作画布过程中始终保持可见的图形元素,配置项 | function | (type) => type === 'node' |
shapes
用于指定在画布操作过程中需要保持可见的图形元素。默认情况下,节点始终可见,而边和组合在操作画布时会被临时隐藏以提升性能。
{shapes: (type, shape) => {// 根据元素类型和图形对象动态决定是否保持可见if (type === 'node') return true; // 所有节点保持可见if (type === 'edge' && shape.get('importante')) return true; // 重要的边保持可见return false; // 其他图形隐藏};}
const graph = new Graph({container: 'container',width: 800,height: 600,behaviors: ['drag-canvas', 'zoom-canvas', 'optimize-viewport-transform'],});
const graph = new Graph({// 其他配置...behaviors: ['drag-canvas','zoom-canvas',{type: 'optimize-viewport-transform',debounce: 500, // 设置更长的防抖时间,在操作停止后0.5秒才恢复显示所有元素},],});
const graph = new Graph({// 其他配置...node: {style: {labelText: 'Drag Canvas!',},},behaviors: ['drag-canvas','zoom-canvas',{type: 'optimize-viewport-transform',shapes: (type, shape) => {if (type === 'node' && shape.className === 'key') return true;return false;},},],});
👇 试试拖拽一下画布,看看效果吧
createGraph({data: {nodes: [{ id: 'node-1', style: { x: 100, y: 100 } }],},node: {style: {labelText: 'Drag Canvas!',},},behaviors: ['drag-canvas',{type: 'optimize-viewport-transform',shapes: (type, shape) => {if (type === 'node' && shape.className === 'key') return true;return false;},},],},{ width: 200, height: 200 },);
可以根据图表元素数量动态决定是否启用优化:
const graph = new Graph({// 其他配置...behaviors: ['drag-canvas','zoom-canvas',function () {// 超出500个元素时启用优化const enable = graph.getNodeData().length + graph.getEdgeData().length > 500;return {type: 'optimize-viewport-transform',key: 'optimize-behavior',enable,};},],});
当图表包含大量节点和边(通常超过500个元素)时,使用此交互可以显著提升操作流畅度。在性能要求高或硬件性能有限的环境中尤其有用。