提交 4fe19430 编写于 作者: S sushuang

some refactor

上级 ac3c2ff2
......@@ -2,7 +2,7 @@
import * as graphic from '../../util/graphic';
import SymbolClz from './Symbol';
import {createListTask} from '../../stream/task';
import {createTask} from 'zrender/src/core/task';
/**
* @constructor
......@@ -32,9 +32,7 @@ symbolDrawProto.resetData = function (seriesModel, isIgnore) {
var data = seriesModel.getData();
var group = this.group;
group.removeAll();
group.clearFrames();
var seriesModel = data.hostModel;
var SymbolCtor = this._symbolCtor;
......@@ -50,30 +48,27 @@ symbolDrawProto.resetData = function (seriesModel, isIgnore) {
cursorStyle: seriesModel.get('cursor')
};
group.removeAll();
var dataEachPump = data.createEachPump(function (newIdx) {
var point = data.getItemLayout(newIdx);
if (symbolNeedsDraw(data, newIdx, isIgnore)) {
var symbolEl = new SymbolCtor(data, newIdx, seriesScope);
symbolEl.attr('position', point);
data.setItemGraphicEl(newIdx, symbolEl);
// ??? not a good interface? which must ensure data index
// corresponding implicitly.
group.add(symbolEl);
}
});
group.enableStream();
group.renderTask.reset();
// ??? pipe here?
seriesModel.pipe(dataEachPump);
seriesModel.pipe(group.renderTask);
return createListTask({
list: data,
progress: function () {
console.log(
'scatter view progress',
'_dueFrameIndex:', group._dueFrameIndex,
'_frameCount:', group._frameCount
);
group.newFrame();
// ??? check useful of the orginal param: isIgnore
return dataEachPump.progress();
}
});
return dataEachPump;
};
symbolDrawProto.updateLayout = function () {
......@@ -83,24 +78,32 @@ symbolDrawProto.updateLayout = function () {
}
var group = this.group;
group.clearFrames();
var data = seriesModel.getData();
return createListTask({
var task = createTask({
list: data,
progress: function (opt) {
var dueDataIndex = opt.dueDataIndex;
// ??? do not match the original frames?
group.newFrame(true);
for (; dueDataIndex < opt.dueEnd; dueDataIndex++) {
progress: function (params, notify) {
var dueDataIndex = params.dueDataIndex;
for (; dueDataIndex < params.dueEnd; dueDataIndex++) {
var point = data.getItemLayout(dueDataIndex);
var el = data.getItemGraphicEl(dueDataIndex);
// Not use animation
el.attr('position', point);
}
return {dueDataIndex: dueDataIndex};
notify(dueDataIndex);
}
});
group.enableStream();
// group.renderTask.reset({reuseData: true});
group.renderTask.reset();
// ??? pipe here?
seriesModel.pipe(task);
seriesModel.pipe(group.renderTask);
return task;
};
symbolDrawProto.remove = function (enableAnimation) {
......
......@@ -12,8 +12,6 @@ echarts.extendChartView({
// ??? back compatibal
render: function (seriesModel, ecModel, api) {
// g && g.clearFrames();
this.group.removeAll();
// var symbolDraw = this._symbolDraw;
......
......@@ -8,7 +8,7 @@ import * as zrUtil from 'zrender/src/core/util';
import Model from '../model/Model';
import DataDiffer from './DataDiffer';
import * as modelUtil from '../util/model';
import {createListTask} from '../stream/task';
import {createTask} from 'zrender/src/core/task';
var isObject = zrUtil.isObject;
......@@ -812,15 +812,15 @@ listProto.createEachPump = function (dims, cb, stack) {
var list = this;
dims = zrUtil.map(normalizeDimensions(dims), list.getDimension, list);
return createListTask({
return createTask({
list: list,
progress: function (opt) {
progress: function (params, notify) {
var dimSize = dims.length;
var dueDataIndex = opt.dueDataIndex;
var dueDataIndex = params.dueDataIndex;
for (; dueDataIndex < opt.dueEnd; dueDataIndex++) {
for (; dueDataIndex < params.dueEnd; dueDataIndex++) {
// Simple optimization
switch (dimSize) {
case 0:
......@@ -852,7 +852,7 @@ listProto.createEachPump = function (dims, cb, stack) {
}
}
return {dueDataIndex: dueDataIndex};
notify(dueDataIndex);
}
});
};
......
......@@ -41,6 +41,8 @@ export var dependencies = {
zrender: '3.7.4'
};
// ??? frame remain time in UI thread: 20ms? 16ms?
var TEST_FRAME_REMAIN_TIME = 1;
var TEST_PROGRESS_STEP = 300;
var PRIORITY_PROCESSOR_FILTER = 1000;
......@@ -281,8 +283,7 @@ echartsProto._onframe = function () {
};
function progressInFrame(ecIns) {
// frame remain time in UI thread: 20ms? 16ms? ???
var remainTime = 20;
var remainTime = TEST_FRAME_REMAIN_TIME;
var unfinished = ecIns._unfinished;
do {
......@@ -296,6 +297,7 @@ function progressInFrame(ecIns) {
// coordSys update
if (unfinished[UNFINISHED_INDEX_VISUAL]) {
// console.log('------------- ec frame visual -------------', remainTime);
updateUnfinished(unfinished, progressVisualEncoding(ecIns), UNFINISHED_INDEX_VISUAL);
}
if (unfinished[UNFINISHED_INDEX_RENDER]) {
......
......@@ -376,7 +376,7 @@ var SeriesModel = ComponentModel.extend({
}
}
tasks.length = i;
originalRemove();
originalRemove.call(this);
};
}
......
/**
* @module echarts/stream/task
*/
import {__DEV__} from '../config';
import {assert, each, defaults} from 'zrender/src/core/util';
var TASK_REG_EXP = /^streamTask(\.|$)/;
// ??? refactor to OO class?
/**
* @param {Object} define
* @param {Function} define.reset
* @param {Function} define.progress
* @param {Function} define.unfinished
* @param {Function} [define.onUpstreamProgress]
* @param {string} [define.subType]
* @return {Object}
* {
* reset: Function,
* progress: Function,
* pipe: Function,
* unfinished: Function,
* onUpstreamProgress: Function
* }
*/
export function createTask(define) {
if (__DEV__) {
assert(
define.reset && define.progress && define.unfinished,
'Methods required'
);
}
var downstreams = [];
var upstreams = [];
var started;
var thisTask = {
type: 'streamTask' + (define.subType ? '.' + define.subType : ''),
/**
* @param {Object} [params]
*/
progress: function (params) {
started = true;
var result = define.progress(params || {});
each(downstreams, function (task) {
task.onUpstreamProgress(result);
});
return result;
},
reset: function () {
started = false;
define.reset();
each(downstreams, function (task) {
task.reset();
});
},
unfinished: define.unfinished,
onUpstreamProgress: define.onUpstreamProgress,
/**
* @param {Object} task The downstream task.
* @return {Object} The downstream task.
*/
pipe: function (task) {
if (__DEV__) {
assert(!started && task.onUpstreamProgress);
}
task.onUpstreamProgress({init: true});
downstreams.push(task);
return task;
},
// ??? necessary? depends on `remove`.
unpipe: function (task) {
for (var i = downstreams.length - 1; i >= 0; i--) {
downstreams[i] === task && downstreams.splice(i, 1);
}
},
// ??? whether use remove to remove itself from container list, or
// its container responsible for it?
remove: function () {
each(upstreams, function (up) {
up.unpipe(thisTask);
});
upstreams.length = 0;
}
};
return thisTask;
}
// /**
// * @param {Function} fn
// * @return {Object} task
// */
// export function createPlainTask(fn) {
// var args;
// return createTask({
// subType: 'plain',
// reset: function () {
// args = arrSlice.call(arguments);
// },
// progress: function () {
// return fn.apply(null, args);
// },
// unfinished: function () {}
// });
// }
/**
* @param {Object} define
* @param {Function} define.progress
* @param {Function} define.list {count:Function}
* @return See the return of `createTask`.
*/
export function createListTask(define) {
var dueEndFromUpstream = null;
var dueDataIndex = 0;
var list = define.list;
return createTask({
subType: 'list',
reset: function () {
dueEndFromUpstream = null;
dueDataIndex = 0;
},
onUpstreamProgress: function (params) {
if (__DEV__) {
assert(params.dueEndDownstream != null || params.init != null);
}
dueEndFromUpstream = params.init ? 0 : params.dueEndDownstream;
},
unfinished: function () {
return dueDataIndex < (
dueEndFromUpstream != null ? dueEndFromUpstream : list.count()
);
},
/**
* @param {Object} [params]
* @param {number} [params.step] Specified step.
* If not specified, progress to current dueEnd.
*/
progress: function (params) {
params = params || {};
var result = define.progress(
defaults({
dueEnd: Math.min(
params.step != null ? dueDataIndex + params.step : Infinity,
dueEndFromUpstream != null ? dueEndFromUpstream : Infinity,
list.count()
),
dueDataIndex: dueDataIndex
}, params)
);
if (__DEV__) {
assert(result.dueDataIndex != null);
}
dueDataIndex = result.dueDataIndex;
var dueEndDownstream = result.dueEndDownstream;
return {
dueEndDownstream: dueEndDownstream != null ? dueEndDownstream : dueDataIndex,
// ??? not a good name.
dueDataIndex: dueDataIndex
};
}
});
}
/**
* @return {boolean}
*/
export function isTask(obj) {
return obj && TASK_REG_EXP.test(obj.type);
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册