xzw 2 jaren geleden
bovenliggende
commit
35e90fe6be

+ 8 - 1
libs/three.js/3dtiles/three-loader-3dtiles.esm.js

@@ -42,6 +42,9 @@ function getGpuMemoryUsage(win = window){//总的
     if(win.parent != win){//还有父级页面。 暂时只有子级需要考虑父级,假设父级在前台时子级已经销毁
         c += getGpuMemoryUsage(win.parent)
     } 
+    
+    viewer.tiles3dMemoryUsage = c
+    
     return  c
 }
 
@@ -7520,7 +7523,7 @@ class TilesetCache {
     const trimTiles = this._trimTiles;
     this._trimTiles = false;
     const list = this._list;
-    const maximumMemoryUsageInBytes = tileset.maximumMemoryUsage * 1024 * 1024;
+    const maximumMemoryUsageInBytes = (Potree.settings.tiles3DMaxMemory ||  tileset.maximumMemoryUsage) * 1024 * 1024;
     const sentinel = this._sentinel;
     let node = list.head;
 
@@ -17733,6 +17736,10 @@ class Loader3DTiles {
                         cameraReference = camera;
                         rendererReference = renderer; 
                         timer += dt;
+                        
+                        if(!ifForce) ifForce = tileset.nextForceUpdate
+                        tileset.nextForceUpdate = false
+                        
                         if (tileset && (timer >= UPDATE_INTERVAL || ifForce)) {
                             if (!lastRootTransform.equals(root.matrixWorld)) {
                                 timer = 0;

+ 39 - 13
src/custom/modules/mergeModel/MergeEditor.js

@@ -281,6 +281,15 @@ let MergeEditor = {
           
         }) */
         
+                   
+        viewer.addEventListener('camera_changed',()=>{
+            Common.intervalTool.isWaiting('updateMemoryUsage', ()=>{  
+                 this.updateMemoryUsage()
+            },  1000) 
+        }) 
+         
+        
+        viewer.addEventListener('setDisplay',this.updateMemoryUsage.bind(this))
     },
     
     
@@ -411,7 +420,7 @@ let MergeEditor = {
                 dispose(e) 
             })
             viewer.objs.remove(model)
-            this.updatePointQuality()
+            this.updateMemoryUsage()
         }   
         
         
@@ -658,31 +667,48 @@ let MergeEditor = {
         
     },
     
-    
-    updatePointQuality(){
-        
-        let posCount=0, gltfCount=0     //gltf的怎么获取模型复杂度?暂时只根据个数吧
+    modelAdded(model){
+        model.addEventListener('isVisible',(e)=>{ 
+            if(e.reason == "overlinePass")return
+            //console.log(e)
+            viewer.addEventListener('update',()=>{ //下一次更新结束后
+                this.updateMemoryUsage()
+            },{once:true})  
+        })
+        this.updateMemoryUsage()
+    },
+    updateMemoryUsage(){
+        //obj暂时不管其贴图大小, 因为顶点造成的不仅是内存还有卡顿所以先只看顶点
+        let maxMemory = 1000 //M 
+        let eachObjPosWeight = 40/1000/1000  //M  每个顶点pos是3*4个字节?法线3*4和uv2*4  其实还有贴图,姑且算10*4个字节,
+        let posCoyunt=0, hasGltf=0      
         viewer.objs.children.forEach(e=>{
             if(e.name == 'glb' || e.name == 'obj'){
                 e.traverse((mesh)=>{
-                    if(mesh.geometry){
+                    /* if(mesh.geometry){
                         posCount += mesh.geometry.attributes.position.count
-                    }
+                    } */
                 })
             }else if(e.name == 'gltf'){
-                gltfCount ++
+                  
             }
         })
-        let score = posCount + gltfCount * 5000
-        let min = 3, max = 5, minP = 20000, maxP = 1000000;
-        let ratio = max - ( max - min) * THREE.Math.clamp((score - minP)  / (maxP - minP),0,1)  
-                
         
+        //获取点云的内存限制
+        let weight = posCount*eachObjPosWeight + viewer.tiles3dMemoryUsage/1024/1024  //M
+        let min = 0.1, max = 6, minP = 100, maxP = 1000000; 
+        let ratio = Math.round(math.linearClamp(score, minP, maxP, max, min )); 
+	    let rest = maxMemory - weight         
+        Potree.pointBudget = rest*1000*1000 
         
-        Potree.pointBudget = ratio*1000*1000
+        //获取3dTiles的内存限制
+        let tiles3DMaxMemory = Potree.config.tiles3DMaxMemory -  Math.round((posCount + Potree.numVisiblePoints) / 100000 )
+        Potree.settings.tiles3DMaxMemory = THREE.Math.clamp(tiles3DMaxMemory , 30, Potree.config.tiles3DMaxMemory )
         
         
         
+        //obj等普通mesh限制不了
+        console.log(ratio, tiles3DMaxMemory)
         
     },
 }   

+ 2 - 0
src/custom/potree.shim.js

@@ -1476,6 +1476,8 @@ Potree.updateVisibility = function(pointclouds, camera, areaSize){
 		lowestSpacing: lowestSpacing
 	};
 };
+
+Potree.numVisiblePoints = 0
 /* 
     note:
     缓存中的点数 Potree.lru.numPoints 一般会 大于 每个点云显示点总数的numVisiblePoints 

+ 2 - 2
src/custom/settings.js

@@ -96,7 +96,7 @@ const config = {//配置参数   不可修改
         cameraHeight : 1000,  //最高  ,注意(如sitemodel)其他的物体不能超过这个高度
     },
     minNodeSize:30, // perspectiveCamera允许加载的node的最小可见像素宽度。越大越省性能
-    
+    tiles3DMaxMemory: 250,//M. 最大支持3dTiles的内存大小 超出会崩溃
     pointDensity:{
         magnifier:{  
             maxLevelPercent: 1,
@@ -437,7 +437,7 @@ let settings = {//设置   可修改
     showAxis : isTest,
     // testCube : true,
     // moveToCenter:true, //针对数据集间隔很远的场景  dis>5000 容易抖动
-    
+    tiles3DMaxMemory: config.tiles3DMaxMemory,
 }
   
  

+ 1 - 1
src/custom/start.js

@@ -814,7 +814,7 @@ export function mergeEditStart(dom){
             }
             
             
-            model.isPointcloud || MergeEditor.updatePointQuality()
+            MergeEditor.modelAdded(model)
             
         }
         

+ 27 - 1
src/custom/viewer/ViewerNew.js

@@ -262,7 +262,7 @@ export class Viewer extends ViewerBase{
                  
             }
             
-
+            this.tiles3dMemoryUsage = 0
             
             this.pointCloudLoadedCallback = args.onPointCloudLoaded || function () {};
 
@@ -4852,6 +4852,7 @@ export class Viewer extends ViewerBase{
                     set: function(v) {
                         vi = v 
                         tileset.visible = v;  //同步,使不加载
+                        tileset.nextForceUpdate = true
                     }
                 })  
             }
@@ -4871,6 +4872,31 @@ export class Viewer extends ViewerBase{
     
     
      
+    
+    setDisplay(state, cause='setDisplay'){//如果创建了iframe,主页的需要隐藏的话需要释放一些内存出来。iframe关闭前也释放下比较保险
+        state = !!state
+        this.objs.children.forEach(e=>{
+            if(e.fileType == '3dTiles'){
+                let tileset = e.runtime.getTileset()
+                Potree.Utils.updateVisible(e,  cause, state)
+                if(!state) tileset._cache.trim(); //使下一次update时dispose所有不可见的tiles
+                e.runtime.update(16, this.renderer, this.mainViewport.camera, true)
+                if(state) this.dispatchEvent('content_changed')
+            }
+        })
+        
+        
+        if(state){
+            Potree.pointBudget = 6*1000*1000 //先随便写一个, 随后mergeEditor.updateMemoryUsage
+        }else{
+            Potree.pointBudget = 0
+            Potree.updatePointClouds(this.scene.pointclouds,  this.mainViewport.camera,  this.mainViewport.resolution )
+        }
+        this.dispatchEvent({type:'setDisplay',state})
+        
+        this.paused = !state  
+    }
+     
         
     addFire(){