Sfoglia il codice sorgente

fix: 降低tiles内存上限

xzw 1 anno fa
parent
commit
6d180dc16c
3 ha cambiato i file con 28 aggiunte e 19 eliminazioni
  1. 25 16
      public/lib/potree/potree.js
  2. 1 1
      public/lib/potree/potree.js.map
  3. 2 2
      src/sdk/cover/index.js

+ 25 - 16
public/lib/potree/potree.js

@@ -76999,11 +76999,11 @@ void main()
 	                modelEditing = null;
 	            }
 	            
-	            
+	             
 	            MergeEditor.modelAdded(model);
 	            
 	        };
-	        
+	         
 	         
 	        
 	        
@@ -77040,18 +77040,18 @@ void main()
 	            viewer.loadModel(info , callback, onProgress, onError);
 	               
 	            
-	            
+	             
 	       
 	        }else if(prop.type == 'osgb' || prop.type == 'b3dm'){  //3d tiles  
 	        
 	            let callback = (object)=>{
-	                 
+	                  
 	                object.isModel = true; 
 	                //透明度怎么办
 	                //object.traverse(e=>e.material && (e.material.transparent = true))
 	                
 	                loadDone(object);
-	            };
+	            }; 
 	        
 	            viewer.loadModel({  
 	                fileType: '3dTiles', 
@@ -77325,7 +77325,7 @@ void main()
 	        cameraHeight : 1000,  //最高  ,注意(如sitemodel)其他的物体不能超过这个高度
 	    },
 	    minNodeSize:30, // perspectiveCamera允许加载的node的最小可见像素宽度。越大越省性能
-	    tiles3DMaxMemory: 250,//M. 最大支持3dTiles的内存大小 超出会崩溃
+	    tiles3DMaxMemory: 100,//M. 最大支持3dTiles的内存大小 超出会崩溃。  改太小太大都会卡,太大崩溃
 	    pointDensity:{
 	        magnifier:{  
 	            maxLevelPercent: 1,
@@ -135713,7 +135713,7 @@ ENDSEC
 	***************************************************************************** */
 
 	 
-	let visiVertexCount = 0;
+
 	let visiGeoCount = 0;
 	const maxVertexVisi = 5e6;
 	const maxTexVisi = 500;
@@ -135739,7 +135739,7 @@ ENDSEC
 	    } 
 	    
 	    viewer.tiles3dMemoryUsage = c;
-	    viewer.tiles3dVisiVCount = visiVertexCount;
+	    
 	    return  c
 	}
 
@@ -143231,8 +143231,14 @@ ENDSEC
 	    while (node !== sentinel && ( getGpuMemoryUsage() > maximumMemoryUsageInBytes || trimTiles)) {
 	      const tile = node.item;
 	      node = node.next;
-	      this.unloadTile(tileset, tile, unloadCallback);
-	    }
+	      this.unloadTile(tileset, tile, unloadCallback); 
+	        //add:  针对部分特别精细的如  https://4dkk.4dage.com/scene_view_data/SG-t-WReTBN204dQ/images/3dtiles/tileset.json
+	        
+	        if(viewer.visiVertexCount > 1500000){ 
+	            tileset.options.maximumScreenSpaceError *= 1.1;
+	            tileset.options.maximumScreenSpaceError = Math.min(1000, tileset.options.maximumScreenSpaceError); 
+	        }
+	    } 
 	    
 	  }
 
@@ -145653,6 +145659,9 @@ ENDSEC
 	class Tileset3D extends EventDispatcher{//xzw add EventDispatcher
 	  constructor(json, options) {
 	      super();
+	      
+	      viewer.visiVertexCount = viewer.visiVertexCount || 0;
+	      
 	    _defineProperty(this, "options", void 0);
 
 	    _defineProperty(this, "loadOptions", void 0);
@@ -153456,9 +153465,9 @@ ENDSEC
 	                            
 	                            // Make sure it's visible 
 	                            if(!renderMap[tile.id].visible){
-	                                if(visiVertexCount<maxVertexVisi){
+	                                if(viewer.visiVertexCount<maxVertexVisi){
 	                                    renderMap[tile.id].visible = true;
-	                                    visiVertexCount += renderMap[tile.id].vertexCount;  //xzw add
+	                                    viewer.visiVertexCount += renderMap[tile.id].vertexCount;  //xzw add
 	                                    options.debug && (boxMap[tile.id].material.opacity = 1 , boxMap[tile.id].children[0].sprite.material.opacity = 1 );
 	                                }else {
 	                                    //console.log('超出', visiVertexCount)
@@ -153476,7 +153485,7 @@ ENDSEC
 	                                renderMap[tile.id].visible = false;
 	                                options.debug && (boxMap[tile.id].material.opacity = 0.1, boxMap[tile.id].children[0].sprite.material.opacity = 0.1);
 	                                
-	                                visiVertexCount -= renderMap[tile.id].vertexCount;  //xzw add
+	                                viewer.visiVertexCount -= renderMap[tile.id].vertexCount;  //xzw add
 	                            } 
 	                        }
 	                    }
@@ -164464,17 +164473,17 @@ ENDSEC
 	            });
 	            
 	        }else if(fileInfo.fileType == '3dTiles'){ 
-	                       
+	                        
 	            let result = await Loader3DTiles.load({
 	                url: fileInfo.url, 
 	                gltfLoader : loaders.glbLoader, 
 	                //renderer: SceneRenderer.renderer   
-	                options: {     
+	                options: {      
 	                    //dracoDecoderPath: '../utils/loaders/DRACOLoader/draco',
 	                    //basisTranscoderPath: '../utils/loaders/KTX2Loader/basis',
 	                    maximumScreenSpaceError: fileInfo.maximumScreenSpaceError || 80,  //越小越清晰。           如果本身tiles很密很小这个值就不能很大。
 	                    //maxDepth: 100, 
-	                    maximumMemoryUsage: 200, //缓存大小。单位M(但实际结果是 2.5*maximumMemoryUsage + 750  。超过2G会崩, 所以应该小于540) 若太小,密集的tile反复加载很卡. (任务管理器刷新网页后若内存不掉就要结束进程否则虚高)
+	                    //maximumMemoryUsage: 100, //缓存大小,见tiles3DMaxMemory。单位M(但实际结果是 2.5*maximumMemoryUsage + 750  。超过2G会崩, 所以应该小于540) 若太小,密集的tile反复加载很卡. (任务管理器刷新网页后若内存不掉就要结束进程否则虚高)
 	                    debug: browser.urlHasValue('tilesBox'),  //show box  
 	                    parent: this.scene.scene, 
 	                    is4dkk: fileInfo.is4dkk,//是否是4dkk中的模型. 通常maximumScreenSpaceError需要10

File diff suppressed because it is too large
+ 1 - 1
public/lib/potree/potree.js.map


+ 2 - 2
src/sdk/cover/index.js

@@ -554,12 +554,12 @@ export const enter = (dom, mapDom, isLocal, lonlat) => {
             }
              
             
-            
+             
             let startLoad = (prop)=>{
                 //if(autoLoads.filter(e=>e.loaded).length>1)return console.log('取消加载', prop), prop.onError()
                  
                 //return prop.onError()
-                prop.maximumScreenSpaceError = 100
+                prop.maximumScreenSpaceError = 60
                 Potree.addModel(prop,  prop.done , prop.progressFun, prop.onError)
                 prop.loading = true
                 console.log('-------开始加载 id:', prop.id, 'title:', prop.title, ', filename:', Potree.Common.getNameFromURL(prop.url),  prop )