From 8aa9d6dc473666dabd18f431fba69b08ff54c912 Mon Sep 17 00:00:00 2001 From: 100pah Date: Sun, 31 May 2026 01:55:53 +0800 Subject: [PATCH] fix: Revert updateTransform to support progressive rendering (e.g. for 'linesGL' in echarts-gl). It is incorrectly break by v6.1.0. --- src/chart/effectScatter/EffectScatterView.ts | 5 +++++ src/chart/lines/LinesView.ts | 5 +++-- src/chart/scatter/ScatterView.ts | 6 ++++-- src/core/echarts.ts | 8 +------- src/util/model.ts | 4 ++++ src/view/Chart.ts | 16 ++++++++++++++++ test/scatter-gps.html | 2 +- 7 files changed, 34 insertions(+), 12 deletions(-) diff --git a/src/chart/effectScatter/EffectScatterView.ts b/src/chart/effectScatter/EffectScatterView.ts index db0e4d2474..f7d0cf5175 100644 --- a/src/chart/effectScatter/EffectScatterView.ts +++ b/src/chart/effectScatter/EffectScatterView.ts @@ -29,6 +29,7 @@ import EffectScatterSeriesModel from './EffectScatterSeries'; import { StageHandlerProgressExecutor } from '../../util/types'; import { createCoordSysClipAreaSimply } from '../helper/createClipPathFromCoordSys'; import { SymbolDrawUpdateOpt } from '../helper/baseDraw'; +import { isInProgressiveRendering } from '../../util/model'; class EffectScatterView extends ChartView { static readonly type = 'effectScatter'; @@ -48,6 +49,10 @@ class EffectScatterView extends ChartView { } updateTransform(seriesModel: EffectScatterSeriesModel, ecModel: GlobalModel, api: ExtensionAPI) { + if (isInProgressiveRendering(seriesModel)) { + return {update: true} as const; + } + const data = seriesModel.getData(); this.group.dirty(); diff --git a/src/chart/lines/LinesView.ts b/src/chart/lines/LinesView.ts index 52c49b8605..683d9f247e 100644 --- a/src/chart/lines/LinesView.ts +++ b/src/chart/lines/LinesView.ts @@ -35,7 +35,7 @@ import SeriesData from '../../data/SeriesData'; import type Polar from '../../coord/polar/Polar'; import type Cartesian2D from '../../coord/cartesian/Cartesian2D'; import Element from 'zrender/src/Element'; -import { getIncrementalId } from '../../util/model'; +import { getIncrementalId, isInProgressiveRendering } from '../../util/model'; import { getCurrentCanvasPainter } from '../../util/graphic'; import { ILineDraw } from '../helper/baseDraw'; @@ -134,7 +134,8 @@ class LinesView extends ChartView { const data = seriesModel.getData(); const lineDraw = this._lineDraw; - if (!this._finished + if (isInProgressiveRendering(seriesModel) + || !this._finished || !lineDraw // TODO Don't have to do update in large mode. Only do it when there are millions of data. || !lineDraw.updateLayout diff --git a/src/chart/scatter/ScatterView.ts b/src/chart/scatter/ScatterView.ts index ae3de65311..61e9dc456e 100644 --- a/src/chart/scatter/ScatterView.ts +++ b/src/chart/scatter/ScatterView.ts @@ -28,7 +28,7 @@ import SeriesData from '../../data/SeriesData'; import { TaskProgressParams } from '../../core/task'; import type { StageHandlerProgressExecutor } from '../../util/types'; import Element from 'zrender/src/Element'; -import { getIncrementalId } from '../../util/model'; +import { getIncrementalId, isInProgressiveRendering } from '../../util/model'; import { createCoordSysClipAreaSimply } from '../helper/createClipPathFromCoordSys'; import { ISymbolDraw, SymbolDrawUpdateOpt } from '../helper/baseDraw'; @@ -78,7 +78,9 @@ class ScatterView extends ChartView { // PENDING this.group.dirty(); - if (!this._finished) { // FIXME: _finished checking is unnecessary? + if (isInProgressiveRendering(seriesModel) + || !this._finished + ) { // FIXME: _finished checking is unnecessary? return {update: true} as const; } else { diff --git a/src/core/echarts.ts b/src/core/echarts.ts index a432ad137a..d489477e25 100644 --- a/src/core/echarts.ts +++ b/src/core/echarts.ts @@ -1973,13 +1973,7 @@ class ECharts extends Eventful { const seriesDirtyMap = createHashMap(); ecModel.eachSeries(function (seriesModel) { const chartView = ecIns._chartsMap[seriesModel.__viewId]; - const pipelineContext = seriesModel.pipelineContext; - if (chartView.updateTransform - // Use the progressive pass if enabled, where each frame renders only a small amount. - // And `ISymbolDraw['updateLayout']` and `ILineDraw['updateLayout']` do not support - // progressive case. - && !pipelineContext.progressiveRender - ) { + if (chartView.updateTransform) { const result = chartView.updateTransform(seriesModel, ecModel, api, payload); result && result.update && seriesDirtyMap.set(seriesModel.uid, 1); } diff --git a/src/util/model.ts b/src/util/model.ts index 1888ee0816..03cc24e131 100644 --- a/src/util/model.ts +++ b/src/util/model.ts @@ -1442,3 +1442,7 @@ export function createSimpleOverallStageHandler2( overallReset: overallReset }; } + +export function isInProgressiveRendering(seriesModel: SeriesModel): boolean { + return seriesModel.pipelineContext.progressiveRender; +} diff --git a/src/view/Chart.ts b/src/view/Chart.ts index 3b93544bc5..19e3b80b62 100644 --- a/src/view/Chart.ts +++ b/src/view/Chart.ts @@ -71,6 +71,22 @@ interface ChartView { /** * Update transform directly. * Implement it if needed. + * + * [NOTICE]: It may be called after normal rendering (via `ChartView['render']`) + * or progressive rendering (via `ChartView['incrementalPrepareRender']` and + * `ChartView['incrementalRender']`). + * For example, echarts-gl `linesGL` supports `updateTransform` to run in + * progressive rendering. + * If a series opts out of supporting `updateTransform` in progressive rendering, + * it can fall back to the normal update path using + * ```js + * updateTransform(seriesModel) { + * if (isInProgressiveRendering(seriesModel)) { + * return {update: true} as const; + * } + * // ... + * } + * ``` */ updateTransform( seriesModel: SeriesModel, diff --git a/test/scatter-gps.html b/test/scatter-gps.html index da91910075..3a72ce78fb 100644 --- a/test/scatter-gps.html +++ b/test/scatter-gps.html @@ -70,7 +70,7 @@ } // var dataURL = `../../echarts-gl/test/data/gps/gps_${idx}.bin`; // var dataURL = `../../data-online/gps/gps_${idx}.bin`; - var dataURL = `../../echarts-examples/public/data/asset/data/gps2/gps_${idx}.bin`; + var dataURL = `../../echarts-examples/public/data/asset/data/gps/gps_${idx}.bin`; var xhr = new XMLHttpRequest(); xhr.open('GET', dataURL, true); xhr.responseType = 'arraybuffer';