feat(scene): 按需进行渲染刷新

This commit is contained in:
thinkinggis 2019-03-26 14:54:17 +08:00
parent 582c4df952
commit 6b2d9b76ca
6 changed files with 41 additions and 8 deletions

View File

@ -31,7 +31,6 @@ export default class Engine extends EventEmitter {
} }
run() { run() {
this.update(); this.update();
this.engineID = requestAnimationFrame(this.run.bind(this)); this.engineID = requestAnimationFrame(this.run.bind(this));
} }

View File

@ -112,6 +112,8 @@ export default class Layer extends Base {
if (type === 'fill') { if (type === 'fill') {
this._addPickMesh(object);// 不对边界线进行拾取 this._addPickMesh(object);// 不对边界线进行拾取
} }
this.scene._engine.update();
setTimeout(() => this.scene._engine.update(), 500);
} }
remove(object) { remove(object) {
if (object.type === 'composer') { if (object.type === 'composer') {

View File

@ -19,11 +19,12 @@ export default class Scene extends Base {
this.addImage(); this.addImage();
this.fontAtlasManager = new FontAtlasManager(); this.fontAtlasManager = new FontAtlasManager();
this._layers = []; this._layers = [];
this.animateCount = 0;
} }
_initEngine(mapContainer) { _initEngine(mapContainer) {
this._engine = new Engine(mapContainer, this); this._engine = new Engine(mapContainer, this);
this._engine.run(); this.registerMapEvent();
// this.workerPool = new WorkerPool(); // this.workerPool = new WorkerPool();
compileBuiltinModules(); compileBuiltinModules();
} }
@ -40,8 +41,8 @@ export default class Scene extends Base {
this._container = document.getElementById(Map.container); this._container = document.getElementById(Map.container);
// const Map = new MapProvider(this.mapContainer, this._attrs); // const Map = new MapProvider(this.mapContainer, this._attrs);
Map.on('mapLoad', () => { Map.on('mapLoad', () => {
this._initEngine(Map.renderDom);
this.map = Map.map; this.map = Map.map;
this._initEngine(Map.renderDom);
Map.asyncCamera(this._engine); Map.asyncCamera(this._engine);
this.initLayer(); this.initLayer();
this._registEvents(); this._registEvents();
@ -117,5 +118,31 @@ export default class Scene extends Base {
layer.destroy(); layer.destroy();
layer = null; layer = null;
} }
startAnimate() {
if (this.animateCount === 0) {
this.unRegsterMapEvent();
this._engine.run();
}
this.animateCount++;
}
stopAnimate() {
if (this.animateCount === 1) {
this._engine.stop();
this.registerMapEvent();
}
this.animateCount++;
}
// 地图状态变化时更新可视化渲染
registerMapEvent() {
this._updateRender = () => this._engine.update();
this.map.on('mousemove', this._updateRender);
this.map.on('mapmove', this._updateRender);
this.map.on('camerachange', this._updateRender);
}
unRegsterMapEvent() {
this.map.off('mousemove', this._updateRender);
this.map.off('mapmove', this._updateRender);
this.map.off('camerachange', this._updateRender);
}
} }

View File

@ -19,10 +19,11 @@ void main(){
mat4 matModelViewProjection=projectionMatrix*modelViewMatrix; mat4 matModelViewProjection=projectionMatrix*modelViewMatrix;
vec4 cur_position=matModelViewProjection*vec4(a_position.xy,0,1); vec4 cur_position=matModelViewProjection*vec4(a_position.xy,0,1);
gl_Position=cur_position / cur_position.w+ vec4(a_textSize*position.xy/u_glSize, 0., 0.)+vec4(a_textOffset/u_glSize * 2.0,0,0); gl_Position=cur_position / cur_position.w+ vec4(a_textSize*position.xy/u_glSize, 0., 0.)+vec4(a_textOffset/u_glSize * 2.0,0,0);
v_color=vec4(a_color.rgb,a_color.a*u_opacity); // v_color=vec4(a_color.rgb,a_color.a*u_opacity);
if(pickingId == u_activeId) { // if(pickingId == u_activeId) {
v_color = u_activeColor; // v_color = u_activeColor;
} // }
v_color = a_color;
v_texcoord=(textUv.xy + vec2(uv.x,1.-uv.y) * textUv.zw)/u_textTextureSize; v_texcoord=(textUv.xy + vec2(uv.x,1.-uv.y) * textUv.zw)/u_textTextureSize;
worldId = id_toPickColor(pickingId); worldId = id_toPickColor(pickingId);

View File

@ -61,6 +61,7 @@ export default class LineLayer extends Layer {
if (animateOptions.enable) { if (animateOptions.enable) {
material.setDefinesvalue('ANIMATE', true); material.setDefinesvalue('ANIMATE', true);
this.scene.startAnimate();
const { duration, interval, trailLength, repeat = Infinity } = animateOptions; const { duration, interval, trailLength, repeat = Infinity } = animateOptions;
this.animateDuration = this.scene._engine.clock.getElapsedTime() + duration * repeat; this.animateDuration = this.scene._engine.clock.getElapsedTime() + duration * repeat;
material.upDateUninform({ material.upDateUninform({
@ -92,6 +93,7 @@ export default class LineLayer extends Layer {
}); });
if (animateOptions.enable) { if (animateOptions.enable) {
material.setDefinesvalue('ANIMATE', true); material.setDefinesvalue('ANIMATE', true);
this.scene.startAnimate();
} }
const mesh = new THREE.LineSegments(geometry, material); const mesh = new THREE.LineSegments(geometry, material);
@ -99,10 +101,11 @@ export default class LineLayer extends Layer {
} }
return this; return this;
} }
_preRender() { preRender() {
if (this.animateDuration > 0 && this.animateDuration < this.scene._engine.clock.getElapsedTime()) { if (this.animateDuration > 0 && this.animateDuration < this.scene._engine.clock.getElapsedTime()) {
this.layerMesh.material.setDefinesvalue('ANIMATE', false); this.layerMesh.material.setDefinesvalue('ANIMATE', false);
this.emit('animateEnd'); this.emit('animateEnd');
this.scene.stopAnimate();
this.animateDuration = Infinity; this.animateDuration = Infinity;
} }
} }

View File

@ -44,6 +44,7 @@ export default class PolygonLayer extends Layer {
return drawPolygon.DrawLine(attributes, style); return drawPolygon.DrawLine(attributes, style);
} else if (animateOptions.enable) { } else if (animateOptions.enable) {
const { near, far } = this.map.getCameraState(); const { near, far } = this.map.getCameraState();
this.scene.startAnimate();
return drawPolygon.DrawAnimate(attributes, { ...style, near, far }); return drawPolygon.DrawAnimate(attributes, { ...style, near, far });
} }
return drawPolygon.DrawFill(attributes, config); return drawPolygon.DrawFill(attributes, config);