Skip to content

Commit 2beba3d

Browse files
committed
Revert "perf: 滚动性能优化 (#1323)"
This reverts commit 31e96b2.
1 parent 31e96b2 commit 2beba3d

File tree

2 files changed

+52
-87
lines changed

2 files changed

+52
-87
lines changed

packages/g-base/src/abstract/container.ts

+34-52
Original file line numberDiff line numberDiff line change
@@ -77,38 +77,29 @@ abstract class Container extends Element implements IContainer {
7777
let maxX = -Infinity;
7878
let minY = Infinity;
7979
let maxY = -Infinity;
80-
let hitChild = false;
80+
const xArr = [];
81+
const yArr = [];
8182
// 将可见元素、图形以及不为空的图形分组筛选出来,用于包围盒合并
82-
this.getChildren().forEach((child) => {
83-
if (
84-
child.get('visible') &&
85-
(!child.isGroup() || (child.isGroup() && (child as IGroup).getChildren().length > 0))
86-
) {
87-
hitChild = true;
88-
const { minX: childMinX, maxX: childMaxX, minY: childMinY, maxY: childMaxY } = child.getBBox();
89-
90-
if (childMinX < minX) {
91-
minX = childMinX;
92-
}
93-
if (childMaxX > maxX) {
94-
maxX = childMaxX;
95-
}
96-
if (childMinY < minY) {
97-
minY = childMinY;
98-
}
99-
if (childMaxY > maxY) {
100-
maxY = childMaxY;
101-
}
102-
}
103-
});
104-
105-
if (!hitChild) {
83+
const children = this.getChildren().filter(
84+
(child) =>
85+
child.get('visible') && (!child.isGroup() || (child.isGroup() && (child as IGroup).getChildren().length > 0))
86+
);
87+
if (children.length > 0) {
88+
each(children, (child: IElement) => {
89+
const box = child.getBBox();
90+
xArr.push(box.minX, box.maxX);
91+
yArr.push(box.minY, box.maxY);
92+
});
93+
minX = min(xArr);
94+
maxX = max(xArr);
95+
minY = min(yArr);
96+
maxY = max(yArr);
97+
} else {
10698
minX = 0;
10799
maxX = 0;
108100
minY = 0;
109101
maxY = 0;
110102
}
111-
112103
const box = {
113104
x: minX,
114105
y: minY,
@@ -128,38 +119,29 @@ abstract class Container extends Element implements IContainer {
128119
let maxX = -Infinity;
129120
let minY = Infinity;
130121
let maxY = -Infinity;
131-
let hitChild = false;
122+
const xArr = [];
123+
const yArr = [];
132124
// 将可见元素、图形以及不为空的图形分组筛选出来,用于包围盒合并
133-
this.getChildren().forEach((child) => {
134-
if (
135-
child.get('visible') &&
136-
(!child.isGroup() || (child.isGroup() && (child as IGroup).getChildren().length > 0))
137-
) {
138-
hitChild = true;
139-
const { minX: childMinX, maxX: childMaxX, minY: childMinY, maxY: childMaxY } = child.getCanvasBBox();
140-
141-
if (childMinX < minX) {
142-
minX = childMinX;
143-
}
144-
if (childMaxX > maxX) {
145-
maxX = childMaxX;
146-
}
147-
if (childMinY < minY) {
148-
minY = childMinY;
149-
}
150-
if (childMaxY > maxY) {
151-
maxY = childMaxY;
152-
}
153-
}
154-
});
155-
156-
if (!hitChild) {
125+
const children = this.getChildren().filter(
126+
(child) =>
127+
child.get('visible') && (!child.isGroup() || (child.isGroup() && (child as IGroup).getChildren().length > 0))
128+
);
129+
if (children.length > 0) {
130+
each(children, (child: IElement) => {
131+
const box = child.getCanvasBBox();
132+
xArr.push(box.minX, box.maxX);
133+
yArr.push(box.minY, box.maxY);
134+
});
135+
minX = min(xArr);
136+
maxX = max(xArr);
137+
minY = min(yArr);
138+
maxY = max(yArr);
139+
} else {
157140
minX = 0;
158141
maxX = 0;
159142
minY = 0;
160143
maxY = 0;
161144
}
162-
163145
const box = {
164146
x: minX,
165147
y: minY,

packages/g-canvas/src/util/draw.ts

+18-35
Original file line numberDiff line numberDiff line change
@@ -114,24 +114,19 @@ export function clearChanged(elements: IElement[]) {
114114

115115
// 当某个父元素发生改变时,调用这个方法级联设置 refresh
116116
function setChildrenRefresh(children: IElement[], region: Region) {
117-
const len = children.length;
118-
for (let i = 0; i < len; i++) {
119-
const child = children[i];
120-
const { cfg } = child;
121-
if (!cfg.visible) {
122-
continue;
123-
}
117+
for (let i = 0; i < children.length; i++) {
118+
const child = children[i] as IElement;
124119
// let refresh = true;
125120
// 获取缓存的 bbox,如果这个 bbox 还存在则说明父元素不是矩阵发生了改变
126121
// const bbox = child.cfg.canvasBBox;
127122
// if (bbox) {
128123
// // 如果这时候
129124
// refresh = intersectRect(bbox, region);
130125
// }
131-
cfg.refresh = true;
126+
child.cfg.refresh = true;
132127
// 如果需要刷新当前节点,所有的子元素设置 refresh
133128
if (child.isGroup()) {
134-
setChildrenRefresh(cfg.children, region);
129+
setChildrenRefresh(child.get('children'), region);
135130
}
136131
}
137132
}
@@ -296,39 +291,27 @@ export function getMergedRegion(elements): Region {
296291
if (!elements.length) {
297292
return null;
298293
}
299-
let mergedMinX;
300-
let mergedMinY;
301-
let mergedMaxX;
302-
let mergedMaxY;
294+
const minXArr = [];
295+
const minYArr = [];
296+
const maxXArr = [];
297+
const maxYArr = [];
303298
each(elements, (el: IElement) => {
304299
const region = getRefreshRegion(el);
305-
306-
if (!region) {
307-
return;
308-
}
309-
310-
const { minX, minY, maxX, maxY } = region;
311-
312-
if (minX < mergedMinX) {
313-
mergedMinX = minX;
314-
}
315-
if (minY < mergedMinY) {
316-
mergedMinY = minY;
317-
}
318-
if (maxX > mergedMaxX) {
319-
mergedMaxX = maxX;
320-
}
321-
if (maxY > mergedMaxY) {
322-
mergedMaxY = maxY;
300+
if (region) {
301+
minXArr.push(region.minX);
302+
minYArr.push(region.minY);
303+
maxXArr.push(region.maxX);
304+
maxYArr.push(region.maxY);
323305
}
324306
});
325307
return {
326-
minX: mergedMinX,
327-
minY: mergedMinY,
328-
maxX: mergedMaxX,
329-
maxY: mergedMaxY,
308+
minX: min(minXArr),
309+
minY: min(minYArr),
310+
maxX: max(maxXArr),
311+
maxY: max(maxYArr),
330312
};
331313
}
314+
332315
export function mergeView(region, viewRegion) {
333316
if (!region || !viewRegion) {
334317
return null;

0 commit comments

Comments
 (0)