소스 검색

同上 增加延时

xzw 3 년 전
부모
커밋
a6e3274067
2개의 변경된 파일59개의 추가작업 그리고 8개의 파일을 삭제
  1. 31 7
      src/navigation/RouteGuider.js
  2. 28 1
      src/utils/Common.js

+ 31 - 7
src/navigation/RouteGuider.js

@@ -13,8 +13,8 @@ const planeGeo = new THREE.PlaneBufferGeometry(1,1);
 const sphereSizeInfo = {
       nearBound : 2, scale:arrowSize, restricMeshScale : true,
 }
-const arrowsShowingCount = 25; //场景里最多展示多少个箭头
-
+//const arrowsShowingCount = 25; //场景里最多展示多少个箭头
+const arrowShowMinDis = 10
 export class RouteGuider extends EventDispatcher{
     constructor () {
 		super();
@@ -32,17 +32,36 @@ export class RouteGuider extends EventDispatcher{
     }
     init(){
         if(this.inited) return;
+        
         let zoom;
         viewer.mapViewer.addEventListener('camera_changed', e => {
+            if(!this.routeStart || !this.routeEnd) return   
             var camera = e.viewport.camera
             if(camera.zoom != zoom){ 
                 this.updateMapArrows(true)
-                zoom = camera.zoom
+                zoom = camera.zoom          //这个就不延时了,因为滚轮不怎么连续
             } 
         })
         
+   
+        
+       
+        let lastPos = new THREE.Vector3
         viewer.addEventListener('camera_changed', e => {
-            this.updateArrowDisplay()
+            if(!this.routeStart || !this.routeEnd) return
+            Common.intervalTool.isWaiting('routeCameraInterval', ()=>{ //延时update,防止卡顿
+                let currPos = viewer.scene.getActiveCamera().position
+             
+                if(!currPos.equals(lastPos)){
+                    lastPos.copy(currPos)
+                    this.updateArrowDisplay() 
+                     
+                    return true 
+                }
+            }, 1000)
+            
+            
+                        
         })
         
         
@@ -458,11 +477,11 @@ export class RouteGuider extends EventDispatcher{
     }
     
     
-    updateArrowDisplay(){//根据当前位置更新显示一定范围内的箭头 
+    updateArrowDisplay(){//根据当前位置更新显示一定范围内的箭头'
     
         if(this.scenePoints.length == 0)return
         
-        var a = Common.sortByScore(this.scenePoints , null, [(point)=>{   //是否还要再requires里限制最远距离?
+        /* var a = Common.sortByScore(this.scenePoints , null, [(point)=>{   //是否还要再requires里限制最远距离?
             var playerPos = viewer.scene.getActiveCamera().position.clone().setZ(0)
             
             var pos = point.clone().setZ(0) 
@@ -476,8 +495,13 @@ export class RouteGuider extends EventDispatcher{
         this.arrows.children.forEach((e,i)=>{
             if(i<startIndex || i>startIndex+arrowsShowingCount)e.visible = false
             else e.visible = true
-        })
+        }) */
         
+        let cameraPos = viewer.scene.getActiveCamera().position
+        this.arrows.children.forEach((e,i)=>{
+            if(e.position.distanceTo(cameraPos) < arrowShowMinDis) e.visible = true
+            else e.visible = false
+        })
         
         
     }

+ 28 - 1
src/utils/Common.js

@@ -200,5 +200,32 @@ var Common = {
         cb && cb();
     }, 
     
-}    
+    intervalTool:{  //延时update,防止卡顿
+        list:[],
+        
+        isWaiting:function(name, func, delayTime){
+            if(!this.list.includes(name)){  //如果没有该项, 则开始判断
+                var needWait = func(); //触发了改变,则等待一段时间后再自动判断
+                if(needWait){
+                    this.list.push(name);
+                    setTimeout(()=>{
+                        var a = this.list.indexOf(name);
+                        this.list.splice(a,1);
+                        this.isWaiting(name, func, delayTime) //循环
+                    },delayTime)
+                } 
+            }
+        },
+        /* wait:function(name, delayTime){
+            this.list.push(name);
+            setTimeout(()=>{
+                
+            },delayTime)
+        }, */
+    }
+}  
+
+
+
+  
 export default Common