xzw 1 tahun lalu
induk
melakukan
2af1a91ca6

+ 17 - 7
libs/three.js/3dtiles/three-loader-3dtiles.esm.js

@@ -31,7 +31,7 @@ PERFORMANCE OF THIS SOFTWARE.
 ***************************************************************************** */
 
  
-let visiVertexCount = 0
+
 let visiGeoCount = 0
 const maxVertexVisi = 5e6
 const maxTexVisi = 500
@@ -57,7 +57,7 @@ function getGpuMemoryUsage(win = window){//总的
     } 
     
     viewer.tiles3dMemoryUsage = c
-    viewer.tiles3dVisiVCount = visiVertexCount
+    
     return  c
 }
 
@@ -7549,8 +7549,13 @@ class TilesetCache {
     while (node !== sentinel && ( getGpuMemoryUsage() > maximumMemoryUsageInBytes || trimTiles)) {
       const tile = node.item;
       node = node.next;
-      this.unloadTile(tileset, tile, unloadCallback);
-    }
+      this.unloadTile(tileset, tile, unloadCallback); 
+        
+        if(viewer.visiVertexCount > 1500000){ //add:  针对部分特别精细的很卡如  https://4dkk.4dage.com/scene_view_data/SG-t-WReTBN204dQ/images/3dtiles/tileset.json
+            tileset.options.maximumScreenSpaceError *= 1.1
+            tileset.options.maximumScreenSpaceError = Math.min(1000, tileset.options.maximumScreenSpaceError) 
+        }
+    } 
     
   }
 
@@ -9971,6 +9976,9 @@ let tilesetSid = 0//add
 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);
@@ -17595,6 +17603,8 @@ class Loader3DTiles {
                         tileContent.visible = false; 
                         renderMap[tile.id] = tileContent;
                         tileContent.name = tile.id //add
+                        tileContent.tile = tile //add
+                        
                         root.add(renderMap[tile.id]);
                         if (options.debug) {
                             const box = loadersBoundingBoxToMesh(tile);
@@ -17772,9 +17782,9 @@ class Loader3DTiles {
                             
                             // 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)
@@ -17792,7 +17802,7 @@ class Loader3DTiles {
                                 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
                             } 
                         }
                     }

+ 1 - 1
src/custom/settings.js

@@ -96,7 +96,7 @@ const config = {//配置参数   不可修改
         cameraHeight : 1000,  //最高  ,注意(如sitemodel)其他的物体不能超过这个高度
     },
     minNodeSize:30, // perspectiveCamera允许加载的node的最小可见像素宽度。越大越省性能
-    tiles3DMaxMemory: 250,//M. 最大支持3dTiles的内存大小 超出会崩溃
+    tiles3DMaxMemory: 100,//M. 最大支持3dTiles的内存大小 超出会崩溃。  改太小太大都会卡,太大崩溃
     pointDensity:{
         magnifier:{  
             maxLevelPercent: 1,

+ 7 - 6
src/custom/start.js

@@ -1135,11 +1135,11 @@ export function mergeEditStart(dom, mapDom){
                 modelEditing = null
             }
             
-            
+             
             MergeEditor.modelAdded(model)
             
         }
-        
+         
          
         
         
@@ -1176,23 +1176,24 @@ export function mergeEditStart(dom, mapDom){
             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({ 
+            viewer.loadModel({  
                 fileType: '3dTiles', 
                 id: prop.id,
                 name : prop.title,
+                maximumScreenSpaceError: prop.maximumScreenSpaceError, 
                 /* tilesUrl: 'https://4dkk.4dage.com/scene_view_data/SS-Ds19qsmuFA/images/3dtiles/tileset.json',
                 transform : { 
                     rotation : [Math.PI/2,  0,   0],

+ 4 - 4
src/custom/viewer/ViewerNew.js

@@ -5414,18 +5414,18 @@ export class Viewer extends ViewerBase{
             })
             
         }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反复加载很卡. (任务管理器刷新网页后若内存不掉就要结束进程否则虚高)
-                    debug:false, //show box  
+                    //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
                     updateTime: fileInfo.updateTime, //加后缀防止缓存