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