|
@@ -659,13 +659,21 @@ export class Viewer extends ViewerBase{
|
|
|
}
|
|
|
|
|
|
|
|
|
- this.reticule.addEventListener('update',(e)=>{
|
|
|
+ /* this.reticule.addEventListener('update',(e)=>{
|
|
|
this.needRender = true
|
|
|
if(this.mapViewer && this.mapViewer.attachedToViewer)this.mapViewer.needRender = true //分屏时mapViewer也有reticule
|
|
|
+ }) */
|
|
|
+
|
|
|
+ this.reticule.addEventListener('update',(e)=>{
|
|
|
+ this.reticule.hoverViewport && (this.reticule.hoverViewport.needRender = true)
|
|
|
+ this.lazyRenderViewports()
|
|
|
+ if(this.mapViewer && this.mapViewer.attachedToViewer &&
|
|
|
+ (this.mapViewer.viewports[0].needRender || this.needRender ) ) this.mapViewer.needRender = true //分屏时mapViewer也有reticule
|
|
|
})
|
|
|
|
|
|
+
|
|
|
this.addEventListener('pointcloud_changed',(e)=>{
|
|
|
- this.needRender = true
|
|
|
+ this.lazyRenderViewports()
|
|
|
})
|
|
|
|
|
|
|
|
@@ -832,6 +840,42 @@ export class Viewer extends ViewerBase{
|
|
|
|
|
|
}
|
|
|
|
|
|
+ lazyRenderViewports(updateCount){
|
|
|
+ //本来要写this.needRender = true的, 但在分四个屏时防止太卡而排队render
|
|
|
+ let viewports = this.viewports
|
|
|
+ if(viewports.length == 1 || this.needRender){
|
|
|
+ return this.needRender = true
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ const maxWaitTime = 200
|
|
|
+
|
|
|
+ let now = Date.now()
|
|
|
+
|
|
|
+ let count = 1
|
|
|
+
|
|
|
+ viewports.forEach(e=>{
|
|
|
+ if(now - e.lastRenderTime > maxWaitTime){
|
|
|
+ e.needRender = true
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ let useCount = viewports.filter(e=>e.needRender).length
|
|
|
+ //console.log('useCount', useCount)
|
|
|
+
|
|
|
+ let list = viewports.filter(e=>!e.needRender).sort((a,b)=>a.lastRenderTime - b.lastRenderTime)
|
|
|
+
|
|
|
+ if(useCount < count){
|
|
|
+ list.slice(0, count - useCount).forEach(e=>{
|
|
|
+ e.needRender = true
|
|
|
+ })
|
|
|
+ }else if(list[0] && now - list[0].lastRenderTime > maxWaitTime){
|
|
|
+ list[0].needRender = true
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
|
|
|
|
|
@@ -3055,13 +3099,20 @@ export class Viewer extends ViewerBase{
|
|
|
}
|
|
|
if(width == 0 || height == 0)return
|
|
|
|
|
|
- let scissorTest = view.width<1 || view.height<1
|
|
|
+ let scissorTest = view.width<1 || view.height<1
|
|
|
if(params_.target){
|
|
|
params_.target.viewport.set(left, bottom, width, height);
|
|
|
scissorTest && params_.target.scissor.set(left, bottom, width, height);
|
|
|
params_.target.scissorTest = scissorTest
|
|
|
this.renderer.setRenderTarget(params_.target)
|
|
|
- }else{
|
|
|
+ }else{
|
|
|
+ /* if(viewports.length == 1 && left == 0 && bottom == 0){
|
|
|
+ left = 1 , width-=1 //这种情况下渲染也会有问题,只有鼠标的地方刷新
|
|
|
+ } */
|
|
|
+ if(scissorTest && left == 0 && bottom == 0){
|
|
|
+ left = 1 , width-=1
|
|
|
+ }
|
|
|
+
|
|
|
this.renderer.setViewport(left, bottom, width, height) //规定视口,影响图形变换(画布的使用范围)
|
|
|
scissorTest && this.renderer.setScissor( left, bottom, width, height );//规定渲染范围
|
|
|
this.renderer.setScissorTest( scissorTest );//开启WebGL剪裁测试功能,如果不开启,.setScissor方法设置的范围不起作用 | width==1且height==1时开启会只有鼠标的地方刷新,很奇怪
|
|
@@ -3075,8 +3126,8 @@ export class Viewer extends ViewerBase{
|
|
|
|
|
|
viewer.dispatchEvent({type: "render.begin", viewer: viewer, viewport:view, params });
|
|
|
|
|
|
-
|
|
|
- view.beforeRender && view.beforeRender()
|
|
|
+
|
|
|
+ view.beforeRender && view.beforeRender()
|
|
|
|
|
|
if(view.render){
|
|
|
if(!view.render($.extend({}, params, {
|
|
@@ -3115,7 +3166,7 @@ export class Viewer extends ViewerBase{
|
|
|
|
|
|
this.dispatchEvent({type: "render.end", viewer: this, viewport:view });
|
|
|
view.needRender = false
|
|
|
-
|
|
|
+ view.lastRenderTime = Date.now()
|
|
|
})
|
|
|
|
|
|
|