|
@@ -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)
|
|
dispose(e)
|
|
})
|
|
})
|
|
viewer.objs.remove(model)
|
|
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=>{
|
|
viewer.objs.children.forEach(e=>{
|
|
if(e.name == 'glb' || e.name == 'obj'){
|
|
if(e.name == 'glb' || e.name == 'obj'){
|
|
e.traverse((mesh)=>{
|
|
e.traverse((mesh)=>{
|
|
- if(mesh.geometry){
|
|
|
|
|
|
+ /* if(mesh.geometry){
|
|
posCount += mesh.geometry.attributes.position.count
|
|
posCount += mesh.geometry.attributes.position.count
|
|
- }
|
|
|
|
|
|
+ } */
|
|
})
|
|
})
|
|
}else if(e.name == 'gltf'){
|
|
}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)
|
|
|
|
|
|
},
|
|
},
|
|
}
|
|
}
|