You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@echarts.apache.org by sh...@apache.org on 2021/10/12 08:51:15 UTC
[echarts] branch optimize-progressive updated: fix(progressive):
use separate zlevel for each progressive series.
This is an automated email from the ASF dual-hosted git repository.
shenyi pushed a commit to branch optimize-progressive
in repository https://gitbox.apache.org/repos/asf/echarts.git
The following commit(s) were added to refs/heads/optimize-progressive by this push:
new d594782 fix(progressive): use separate zlevel for each progressive series.
d594782 is described below
commit d5947823ea857c560427fd6a7c847aebf184eeb6
Author: pissang <bm...@gmail.com>
AuthorDate: Tue Oct 12 16:50:11 2021 +0800
fix(progressive): use separate zlevel for each progressive series.
Also for series with trail effect
---
src/chart/lines/LinesSeries.ts | 6 ++++
src/chart/lines/LinesView.ts | 15 +++-------
src/chart/scatter/ScatterSeries.ts | 5 ++++
src/core/echarts.ts | 59 +++++++++++++++++++++++++++++++++++---
src/model/Component.ts | 8 ++++++
5 files changed, 78 insertions(+), 15 deletions(-)
diff --git a/src/chart/lines/LinesSeries.ts b/src/chart/lines/LinesSeries.ts
index 7598626..9e312fd 100644
--- a/src/chart/lines/LinesSeries.ts
+++ b/src/chart/lines/LinesSeries.ts
@@ -372,6 +372,12 @@ class LinesSeriesModel extends SeriesModel<LinesSeriesOption> {
return progressiveThreshold;
}
+ needsSeparateZLevel() {
+ const effectModel = this.getModel('effect');
+ return this.getData().count() > this.getProgressiveThreshold()
+ || (effectModel.get('show') && effectModel.get('trailLength') > 0);
+ }
+
static defaultOption: LinesSeriesOption = {
coordinateSystem: 'geo',
zlevel: 0,
diff --git a/src/chart/lines/LinesView.ts b/src/chart/lines/LinesView.ts
index 36de7d2..fabb849 100644
--- a/src/chart/lines/LinesView.ts
+++ b/src/chart/lines/LinesView.ts
@@ -72,23 +72,16 @@ class LinesView extends ChartView {
motionBlur: false
});
}
- if (this._showEffect(seriesModel) && trailLength) {
- if (__DEV__) {
- let notInIndividual = false;
- ecModel.eachSeries(function (otherSeriesModel) {
- if (otherSeriesModel !== seriesModel && otherSeriesModel.get('zlevel') === zlevel) {
- notInIndividual = true;
- }
- });
- notInIndividual && console.warn('Lines with trail effect should have an individual zlevel');
- }
-
+ if (this._showEffect(seriesModel) && trailLength > 0) {
if (!isSvg) {
zr.configLayer(zlevel, {
motionBlur: true,
lastFrameAlpha: Math.max(Math.min(trailLength / 10 + 0.9, 1), 0)
});
}
+ else if (__DEV__) {
+ console.warn('SVG render mode doesn\'t support lines with trail effect');
+ }
}
lineDraw.updateData(data as SeriesData);
diff --git a/src/chart/scatter/ScatterSeries.ts b/src/chart/scatter/ScatterSeries.ts
index f79f422..e80d8ad 100644
--- a/src/chart/scatter/ScatterSeries.ts
+++ b/src/chart/scatter/ScatterSeries.ts
@@ -115,6 +115,11 @@ class ScatterSeriesModel extends SeriesModel<ScatterSeriesOption> {
return selectors.point(data.getItemLayout(dataIndex));
}
+ needsSeparateZLevel() {
+ return this.getData().count() > this.getProgressiveThreshold();
+ }
+
+
static defaultOption: ScatterSeriesOption = {
coordinateSystem: 'cartesian2d',
zlevel: 0,
diff --git a/src/core/echarts.ts b/src/core/echarts.ts
index 52cc6b6..740f632 100644
--- a/src/core/echarts.ts
+++ b/src/core/echarts.ts
@@ -111,7 +111,6 @@ import {
AnimationOption
} from '../util/types';
import Displayable from 'zrender/src/graphic/Displayable';
-import IncrementalDisplayable from 'zrender/src/graphic/IncrementalDisplayable';
import { seriesSymbolTask, dataSymbolTask } from '../visual/symbol';
import { getVisualFromData, getItemVisualFromData } from '../visual/helper';
import { deprecateLog } from '../util/log';
@@ -2008,10 +2007,61 @@ class ECharts extends Eventful<ECEventDefinition> {
});
};
+ // Allocate zlevels
+ function allocateZlevels(ecModel: GlobalModel) {
+ interface ZLevelItem {
+ z: number,
+ idx: number,
+ type: string
+ };
+ const componentZLevels: ZLevelItem[] = [];
+ const seriesZLevels: ZLevelItem[] = [];
+ let lastSeriesZLevel: number;
+ let isLastSeriesNeedsSeparate: boolean;
+ ecModel.eachComponent(function (componentType, componentModel) {
+ const zlevel = componentModel.get('zlevel') || 0;
+ (componentType === 'series' ? seriesZLevels : componentZLevels).push({
+ z: zlevel,
+ idx: componentModel.componentIndex,
+ type: componentType
+ });
+ });
+
+ // Series after component
+ const zLevels: ZLevelItem[] = componentZLevels.concat(seriesZLevels);
+
+ timsort(zLevels, (a, b) => {
+ return a.z - b.z;
+ });
+ each(zLevels, item => {
+ const componentModel = ecModel.getComponent(item.type, item.idx);
+ let zlevel = item.z;
+ if (lastSeriesZLevel != null) {
+ zlevel = Math.max(lastSeriesZLevel, zlevel);
+ }
+ if (componentModel.needsSeparateZLevel()) {
+ if (zlevel === lastSeriesZLevel) {
+ zlevel++;
+ }
+ isLastSeriesNeedsSeparate = true;
+ }
+ else if (isLastSeriesNeedsSeparate) {
+ if (zlevel === lastSeriesZLevel) {
+ zlevel++;
+ }
+ isLastSeriesNeedsSeparate = false;
+ }
+ lastSeriesZLevel = zlevel;
+ componentModel.setZLevel(zlevel);
+ });
+
+ }
+
render = (
ecIns: ECharts, ecModel: GlobalModel, api: ExtensionAPI, payload: Payload,
updateParams: UpdateLifecycleParams
) => {
+ allocateZlevels(ecModel);
renderComponents(ecIns, ecModel, api, payload, updateParams);
@@ -2067,6 +2117,7 @@ class ECharts extends Eventful<ECEventDefinition> {
// TODO progressive?
lifecycle.trigger('series:beforeupdate', ecModel, api, updateParams);
+
let unfinished: boolean = false;
ecModel.eachSeries(function (seriesModel) {
const chartView = ecIns._chartsMap[seriesModel.__viewId];
@@ -2220,13 +2271,13 @@ class ECharts extends Eventful<ECEventDefinition> {
const zlevel = model.get('zlevel') || 0;
// Set z and zlevel
view.eachRendered((el) => {
- _updateZ(el, z, zlevel, -Infinity);
+ doUpdateZ(el, z, zlevel, -Infinity);
// Don't traverse the children because it has been traversed in _updateZ.
return true;
});
};
- function _updateZ(el: Element, z: number, zlevel: number, maxZ2: number): number {
+ function doUpdateZ(el: Element, z: number, zlevel: number, maxZ2: number): number {
// Group may also have textContent
const label = el.getTextContent();
const labelLine = el.getTextGuideLine();
@@ -2236,7 +2287,7 @@ class ECharts extends Eventful<ECEventDefinition> {
// set z & zlevel of children elements of Group
const children = (el as graphic.Group).childrenRef();
for (let i = 0; i < children.length; i++) {
- maxZ2 = Math.max(_updateZ(children[i], z, zlevel, maxZ2), maxZ2);
+ maxZ2 = Math.max(doUpdateZ(children[i], z, zlevel, maxZ2), maxZ2);
}
}
else {
diff --git a/src/model/Component.ts b/src/model/Component.ts
index a730d14..e18fb61 100644
--- a/src/model/Component.ts
+++ b/src/model/Component.ts
@@ -311,6 +311,14 @@ class ComponentModel<Opt extends ComponentOption = ComponentOption> extends Mode
};
}
+ needsSeparateZLevel() {
+ return false;
+ }
+
+ setZLevel(zlevel: number) {
+ this.option.zlevel = zlevel;
+ }
+
// // Interfaces for component / series with select ability.
// select(dataIndex?: number[], dataType?: string): void {}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@echarts.apache.org
For additional commands, e-mail: commits-help@echarts.apache.org