From 90e4f6c3a6f1b91d0a9f8adfbdead4d4578222ee Mon Sep 17 00:00:00 2001 From: "yuqi.pyq" Date: Thu, 13 Apr 2023 20:22:59 +0800 Subject: [PATCH] perf: merge bbox & set refresh flag recursively --- packages/g-base/package.json | 2 +- packages/g-base/src/abstract/container.ts | 44 +++++++++++++---------- packages/g-canvas/package.json | 2 +- packages/g-canvas/src/util/draw.ts | 3 ++ 4 files changed, 31 insertions(+), 20 deletions(-) diff --git a/packages/g-base/package.json b/packages/g-base/package.json index 149aed7fa..4b9bb157b 100644 --- a/packages/g-base/package.json +++ b/packages/g-base/package.json @@ -1,6 +1,6 @@ { "name": "@antv/g-base", - "version": "0.5.14", + "version": "0.5.15", "description": "A common util collection for antv projects", "main": "lib/index.js", "module": "esm/index.js", diff --git a/packages/g-base/src/abstract/container.ts b/packages/g-base/src/abstract/container.ts index e58c3bf93..985736c22 100644 --- a/packages/g-base/src/abstract/container.ts +++ b/packages/g-base/src/abstract/container.ts @@ -77,8 +77,6 @@ abstract class Container extends Element implements IContainer { let maxX = -Infinity; let minY = Infinity; let maxY = -Infinity; - const xArr = []; - const yArr = []; // 将可见元素、图形以及不为空的图形分组筛选出来,用于包围盒合并 const children = this.getChildren().filter( (child) => @@ -86,14 +84,20 @@ abstract class Container extends Element implements IContainer { ); if (children.length > 0) { each(children, (child: IElement) => { - const box = child.getBBox(); - xArr.push(box.minX, box.maxX); - yArr.push(box.minY, box.maxY); + const { minX: childMinX, maxX: childMaxX, minY: childMinY, maxY: childMaxY } = child.getBBox(); + if (childMinX < minX) { + minX = childMinX; + } + if (childMaxX > maxX) { + maxX = childMaxX; + } + if (childMinY < minY) { + minY = childMinY; + } + if (childMaxY > maxY) { + maxY = childMaxY; + } }); - minX = min(xArr); - maxX = max(xArr); - minY = min(yArr); - maxY = max(yArr); } else { minX = 0; maxX = 0; @@ -119,8 +123,6 @@ abstract class Container extends Element implements IContainer { let maxX = -Infinity; let minY = Infinity; let maxY = -Infinity; - const xArr = []; - const yArr = []; // 将可见元素、图形以及不为空的图形分组筛选出来,用于包围盒合并 const children = this.getChildren().filter( (child) => @@ -128,14 +130,20 @@ abstract class Container extends Element implements IContainer { ); if (children.length > 0) { each(children, (child: IElement) => { - const box = child.getCanvasBBox(); - xArr.push(box.minX, box.maxX); - yArr.push(box.minY, box.maxY); + const { minX: childMinX, maxX: childMaxX, minY: childMinY, maxY: childMaxY } = child.getCanvasBBox(); + if (childMinX < minX) { + minX = childMinX; + } + if (childMaxX > maxX) { + maxX = childMaxX; + } + if (childMinY < minY) { + minY = childMinY; + } + if (childMaxY > maxY) { + maxY = childMaxY; + } }); - minX = min(xArr); - maxX = max(xArr); - minY = min(yArr); - maxY = max(yArr); } else { minX = 0; maxX = 0; diff --git a/packages/g-canvas/package.json b/packages/g-canvas/package.json index 6af6e6b4f..40e86cc6c 100644 --- a/packages/g-canvas/package.json +++ b/packages/g-canvas/package.json @@ -1,6 +1,6 @@ { "name": "@antv/g-canvas", - "version": "0.5.13", + "version": "0.5.14", "description": "A canvas library which providing 2d", "main": "lib/index.js", "module": "esm/index.js", diff --git a/packages/g-canvas/src/util/draw.ts b/packages/g-canvas/src/util/draw.ts index a1440309f..d74a1283f 100644 --- a/packages/g-canvas/src/util/draw.ts +++ b/packages/g-canvas/src/util/draw.ts @@ -116,6 +116,9 @@ export function clearChanged(elements: IElement[]) { function setChildrenRefresh(children: IElement[], region: Region) { for (let i = 0; i < children.length; i++) { const child = children[i] as IElement; + if (!child.cfg.visible) { + continue; + } // let refresh = true; // 获取缓存的 bbox,如果这个 bbox 还存在则说明父元素不是矩阵发生了改变 // const bbox = child.cfg.canvasBBox;