|
@@ -10,6 +10,8 @@ import {PLYLoader} from "../../../libs/three.js/loaders/PLYLoader.js";
|
|
//--------以上文件只在部分工程中添加-------------------------
|
|
//--------以上文件只在部分工程中添加-------------------------
|
|
|
|
|
|
import * as THREE from "../../../libs/three.js/build/three.module.js";
|
|
import * as THREE from "../../../libs/three.js/build/three.module.js";
|
|
|
|
+import Stats from "../../../libs/stats.js/stats.js";
|
|
|
|
+
|
|
import {ClipTask, ClipMethod, CameraMode, LengthUnits, ElevationGradientRepeat} from "../../defines.js";
|
|
import {ClipTask, ClipMethod, CameraMode, LengthUnits, ElevationGradientRepeat} from "../../defines.js";
|
|
import {TagTool} from "../objects/tool/TagTool.js";
|
|
import {TagTool} from "../objects/tool/TagTool.js";
|
|
import Compass from "../objects/tool/Compass.js";
|
|
import Compass from "../objects/tool/Compass.js";
|
|
@@ -123,7 +125,9 @@ export class Viewer extends ViewerBase{
|
|
window.viewer = this
|
|
window.viewer = this
|
|
mapArea = mapArea_
|
|
mapArea = mapArea_
|
|
|
|
|
|
-
|
|
|
|
|
|
+ if(this.renderer.capabilities.isWebGL2){
|
|
|
|
+ Potree.settings.isWebgl2 = true //是否启用webgl2
|
|
|
|
+ }
|
|
|
|
|
|
if(Potree.settings.editType == "pano" || Potree.settings.editType == "merge"){
|
|
if(Potree.settings.editType == "pano" || Potree.settings.editType == "merge"){
|
|
this.modules = {
|
|
this.modules = {
|
|
@@ -175,18 +179,38 @@ export class Viewer extends ViewerBase{
|
|
},10000) */
|
|
},10000) */
|
|
},2000)
|
|
},2000)
|
|
|
|
|
|
|
|
+
|
|
|
|
|
|
- this.fpsCollect = []
|
|
|
|
- Potree.fps = 30 //随便写一个
|
|
|
|
- }
|
|
|
|
- setTimeout(()=>{
|
|
|
|
-
|
|
|
|
- console.log('depthSamChangeImg',Potree.timeCollect.depthSamChangeImg.median, 'sortByScore',Potree.timeCollect.sortByScore.median)
|
|
|
|
- console.log('fps',Potree.fps)
|
|
|
|
|
|
+ {
|
|
|
|
+ this.fpsCollect = {}
|
|
|
|
+ let init = (name)=>{
|
|
|
|
+ this.fpsCollect[name] = []
|
|
|
|
+ this.fpsCollect[name].durSum = 0
|
|
|
|
+ }
|
|
|
|
+ init('short')
|
|
|
|
+ init('long')
|
|
|
|
+ init('rendered')
|
|
|
|
+ init('renderedLong')
|
|
|
|
+ init('camChanged')
|
|
|
|
+ init('camChangedLong')
|
|
|
|
+ Potree.fps = 40 //随便写一个
|
|
|
|
+ Potree.fps2 = 40 //随便写一个
|
|
|
|
+ Potree.fpsRendered = 35 //随便写一个
|
|
|
|
+ Potree.fpsRendered2 = 35 //随便写一个
|
|
|
|
+ Potree.fpsCamChanged = 30 //随便写一个
|
|
|
|
+ Potree.fpsCamChanged2 = 30 //随便写一个
|
|
|
|
+ //this.pageHiddenCollect = []
|
|
|
|
+ }
|
|
|
|
|
|
- },25000)
|
|
|
|
|
|
+ setTimeout(()=>{
|
|
|
|
+ console.log('depthSamChangeImg',Potree.timeCollect.depthSamChangeImg.median, 'sortByScore',Potree.timeCollect.sortByScore.median)
|
|
|
|
+ console.log('fps',Potree.fps, Potree.fps2,Potree.fpsRendered )
|
|
|
|
+
|
|
|
|
+ },25000)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
|
|
-
|
|
|
|
|
|
+ this.memoryModelCountInfo = {tilePosCount:0,tileTexArea:0,otherPosCount:0,otherTexArea:0}
|
|
this.navigateMode = 'free' // 'panorama'; 'free'自由模式是只显示点云或者未进入到漫游点,
|
|
this.navigateMode = 'free' // 'panorama'; 'free'自由模式是只显示点云或者未进入到漫游点,
|
|
this.isEdit = true
|
|
this.isEdit = true
|
|
this.waitQueue = []
|
|
this.waitQueue = []
|
|
@@ -371,9 +395,9 @@ export class Viewer extends ViewerBase{
|
|
this.initDragAndDrop();
|
|
this.initDragAndDrop();
|
|
}
|
|
}
|
|
|
|
|
|
- if(typeof Stats !== "undefined"){
|
|
|
|
|
|
+ if(Potree.settings.isTest){
|
|
this.stats = new Stats();
|
|
this.stats = new Stats();
|
|
- this.stats.showPanel( 0 ); // 0: fps, 1: ms, 2: mb, 3+: custom
|
|
|
|
|
|
+ this.stats.showPanel( 2 ); // 0: fps, 1: ms, 2: mb, 3+: custom
|
|
document.body.appendChild( this.stats.dom );
|
|
document.body.appendChild( this.stats.dom );
|
|
}
|
|
}
|
|
|
|
|
|
@@ -491,8 +515,7 @@ export class Viewer extends ViewerBase{
|
|
this.mainViewport = new Viewport( this.scene.view, this.scene.cameraP, {
|
|
this.mainViewport = new Viewport( this.scene.view, this.scene.cameraP, {
|
|
left:0, bottom:0, width:1, height: 1, name:'MainView'
|
|
left:0, bottom:0, width:1, height: 1, name:'MainView'
|
|
})
|
|
})
|
|
- this.viewports = [this.mainViewport]
|
|
|
|
-
|
|
|
|
|
|
+ this.viewports = [this.mainViewport]
|
|
Potree.settings.showCompass && (this.compass = new Compass(Potree.settings.compassDom, this.mainViewport));
|
|
Potree.settings.showCompass && (this.compass = new Compass(Potree.settings.compassDom, this.mainViewport));
|
|
|
|
|
|
|
|
|
|
@@ -746,6 +769,7 @@ export class Viewer extends ViewerBase{
|
|
this.addEventListener('allLoaded', ()=>{
|
|
this.addEventListener('allLoaded', ()=>{
|
|
setTimeout(this.testPointcloudsMaxLevel.bind(this), 1000) //延迟一丢丢,等画面出现
|
|
setTimeout(this.testPointcloudsMaxLevel.bind(this), 1000) //延迟一丢丢,等画面出现
|
|
|
|
|
|
|
|
+ //Potree.settings.renderAllViewports = browser.maybeQilin() && this.renderer.capabilities.maxCubemapSize <= 2048 && //麒麟chromium若获取过webgl2只渲染一个viewport的话其他的会变黑
|
|
|
|
|
|
this.scene.pointclouds.forEach(pointcloud=>{
|
|
this.scene.pointclouds.forEach(pointcloud=>{
|
|
pointcloud.addEventListener('isVisible',(e)=>{//是否显示该点的mesh(不显示也能走)
|
|
pointcloud.addEventListener('isVisible',(e)=>{//是否显示该点的mesh(不显示也能走)
|
|
@@ -774,7 +798,7 @@ export class Viewer extends ViewerBase{
|
|
|
|
|
|
|
|
|
|
this.createHackMesh()
|
|
this.createHackMesh()
|
|
- })
|
|
|
|
|
|
+ },{once:true})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -875,6 +899,12 @@ export class Viewer extends ViewerBase{
|
|
let v = !document.hidden
|
|
let v = !document.hidden
|
|
//console.warn('visibilitychange', v )
|
|
//console.warn('visibilitychange', v )
|
|
this.dispatchEvent({type:'pageVisible', v } )
|
|
this.dispatchEvent({type:'pageVisible', v } )
|
|
|
|
+ //this.pageHiddenCollect.push({time:performance.now, visible:v})
|
|
|
|
+
|
|
|
|
+ if(!v){
|
|
|
|
+ let marks = performance.getEntriesByName("loop-start")
|
|
|
|
+ marks.length && (marks[marks.length-1].pageHidden = true)
|
|
|
|
+ }
|
|
|
|
|
|
if(this.screenshoting && !v){//截图过程中离开页面需要照常loop。但是尽量别离开页面,效果只能达到90%
|
|
if(this.screenshoting && !v){//截图过程中离开页面需要照常loop。但是尽量别离开页面,效果只能达到90%
|
|
interval = setInterval(()=>{
|
|
interval = setInterval(()=>{
|
|
@@ -977,7 +1007,32 @@ export class Viewer extends ViewerBase{
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
|
|
|
|
+ getObjectPointCount(object){
|
|
|
|
+ let posCount = 0, texArea = 0
|
|
|
|
+ object.traverse((mesh, o={})=>{
|
|
|
|
+ //let visi = o.visible === false ? false : mesh.visible //mesh.realVisible() //如果祖先不可见,此mesh一定不可见
|
|
|
|
+ if(mesh.geometry){
|
|
|
|
+ posCount += mesh.geometry.attributes.position.count
|
|
|
|
+ //visi && (visiPosCount += mesh.geometry.attributes.position.count)
|
|
|
|
+ }
|
|
|
|
+ /* if(mesh.material && !mesh.material.map){
|
|
|
|
+ console.log('!mesh.material.map ?')
|
|
|
|
+ } */
|
|
|
|
+ if(mesh.material){
|
|
|
|
+ let mats = (mesh.material instanceof Array) ? mesh.material : [mesh.material]
|
|
|
|
+ mats.forEach(mat =>{
|
|
|
|
+ if(mat.map){
|
|
|
|
+ texArea += mat.map.image.width * mat.map.image.height
|
|
|
|
+ //visi && (visiTexArea += a)
|
|
|
|
+ }
|
|
|
|
+ })
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ //return {visible:visi}
|
|
|
|
+ })
|
|
|
|
+ return {posCount , texArea }
|
|
|
|
+ }
|
|
|
|
|
|
|
|
|
|
ifPointBlockedByIntersect(point , panoId, soon ){//点是否被遮挡
|
|
ifPointBlockedByIntersect(point , panoId, soon ){//点是否被遮挡
|
|
@@ -3507,7 +3562,7 @@ export class Viewer extends ViewerBase{
|
|
if('renderBeforeCloud' in params){
|
|
if('renderBeforeCloud' in params){
|
|
this.scene.scene.traverse((object)=>{
|
|
this.scene.scene.traverse((object)=>{
|
|
if(object.material){
|
|
if(object.material){
|
|
- let transparent = object.material.opacity<1 || object.material.mapTransparent || !object.material.depthTest
|
|
|
|
|
|
+ let transparent = object.material.opacity<1 || object.material.mapTransparent || !object.material.depthTest || !object.material.depthWrite //不写入深度的往往最后来比较
|
|
Potree.Utils.updateVisible(object, 'renderOpa', params.renderBeforeCloud != transparent)
|
|
Potree.Utils.updateVisible(object, 'renderOpa', params.renderBeforeCloud != transparent)
|
|
//点云之前渲染的话隐藏半透明的, 点云之后渲染的话隐藏不透明的。 depthTest==false的也最后渲染。 mapTransparent是手动加的,代表确定该贴图含有透明部分,即使opacity为1
|
|
//点云之前渲染的话隐藏半透明的, 点云之后渲染的话隐藏不透明的。 depthTest==false的也最后渲染。 mapTransparent是手动加的,代表确定该贴图含有透明部分,即使opacity为1
|
|
}
|
|
}
|
|
@@ -3538,10 +3593,11 @@ export class Viewer extends ViewerBase{
|
|
|
|
|
|
|
|
|
|
let mesh = new THREE.Mesh(viewer.images360.panos[0].marker.geometry, new THREE.MeshBasicMaterial({color:"#F00",side:2/* ,depthTest:false */}))
|
|
let mesh = new THREE.Mesh(viewer.images360.panos[0].marker.geometry, new THREE.MeshBasicMaterial({color:"#F00",side:2/* ,depthTest:false */}))
|
|
- mesh.visible = false
|
|
|
|
|
|
+ Potree.Utils.updateVisible(mesh,'show',false)
|
|
|
|
+
|
|
this.images360.node.add(mesh)
|
|
this.images360.node.add(mesh)
|
|
|
|
|
|
-
|
|
|
|
|
|
+
|
|
let updatePos = ()=>{
|
|
let updatePos = ()=>{
|
|
let dir = this.mainViewport.view.direction
|
|
let dir = this.mainViewport.view.direction
|
|
let radius = this.images360.cube.scale.length()
|
|
let radius = this.images360.cube.scale.length()
|
|
@@ -3558,22 +3614,19 @@ export class Viewer extends ViewerBase{
|
|
}
|
|
}
|
|
})
|
|
})
|
|
|
|
|
|
- this.images360.addEventListener( 'flyToPanoDone', e=>{
|
|
|
|
- if(this.images360.currentPano.depthTex){
|
|
|
|
- mesh.visible = false
|
|
|
|
|
|
+ let judge = ()=>{
|
|
|
|
+ if(!this.images360.currentPano?.depthTex && Potree.settings.displayMode == 'showPanos'){
|
|
|
|
+ Potree.Utils.updateVisible(mesh,'show',true)
|
|
}else{
|
|
}else{
|
|
- mesh.visible = true
|
|
|
|
- }
|
|
|
|
- })
|
|
|
|
-
|
|
|
|
- this.images360.addEventListener( 'endChangeMode', e=>{
|
|
|
|
- if(e.mode == 'showPanos' && !this.images360.currentPano.depthTex){
|
|
|
|
- mesh.visible = true
|
|
|
|
- updatePos()
|
|
|
|
- }else{
|
|
|
|
- mesh.visible = false
|
|
|
|
|
|
+ Potree.Utils.updateVisible(mesh,'show',false)
|
|
}
|
|
}
|
|
- })
|
|
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ this.images360.addEventListener( 'flyToPanoDone', judge)
|
|
|
|
+
|
|
|
|
+ this.images360.addEventListener( 'endChangeMode', judge)
|
|
|
|
|
|
|
|
|
|
//不知道如果用点云计算非当前视角下的block会不会黑闪,如热点遮挡计算
|
|
//不知道如果用点云计算非当前视角下的block会不会黑闪,如热点遮挡计算
|
|
@@ -3639,13 +3692,13 @@ export class Viewer extends ViewerBase{
|
|
async render(params={}){//add params
|
|
async render(params={}){//add params
|
|
viewer.addTimeMark('render','start')
|
|
viewer.addTimeMark('render','start')
|
|
const vrActive = this.renderer.xr.isPresenting;
|
|
const vrActive = this.renderer.xr.isPresenting;
|
|
- let SiteModel = viewer.modules.SiteModel
|
|
|
|
|
|
+ let {SiteModel,PanoEditor} = viewer.modules
|
|
|
|
|
|
if(this.screenshoting && !params.screenshot)return //正在截图
|
|
if(this.screenshoting && !params.screenshot)return //正在截图
|
|
|
|
|
|
let s = SiteModel.editing && SiteModel.selected && (SiteModel.selected.buildType == 'room' || SiteModel.selected.buildType == 'floor') //空间模型的房间选中材质是需要depth的,这时候需要绘制两次点云
|
|
let s = SiteModel.editing && SiteModel.selected && (SiteModel.selected.buildType == 'room' || SiteModel.selected.buildType == 'floor') //空间模型的房间选中材质是需要depth的,这时候需要绘制两次点云
|
|
|
|
|
|
- Potree.settings.pointEnableRT = !this.screenshoting && (this.scene.measurements.filter(e=>e.visible).length > 0 || s )
|
|
|
|
|
|
+ Potree.settings.pointEnableRT = !this.screenshoting && (this.scene.measurements.filter(e=>e.visible).length > 0 || s || PanoEditor?.entered || this.scene.tags.children.some(e=>e.visible))
|
|
|
|
|
|
|
|
|
|
if(vrActive){
|
|
if(vrActive){
|
|
@@ -3654,11 +3707,12 @@ export class Viewer extends ViewerBase{
|
|
let specialRender = !!params.viewports
|
|
let specialRender = !!params.viewports
|
|
let viewports = params.viewports || this.viewports
|
|
let viewports = params.viewports || this.viewports
|
|
|
|
|
|
- if(!this.needRender){
|
|
|
|
|
|
+ if(!this.needRender && !Potree.settings.renderAllViewports){
|
|
viewports = viewports.filter(v=>v.needRender) //可以渲染的条件是viewer或viewport的needRender为true
|
|
viewports = viewports.filter(v=>v.needRender) //可以渲染的条件是viewer或viewport的needRender为true
|
|
}
|
|
}
|
|
viewports = viewports.filter(v=>v.active)
|
|
viewports = viewports.filter(v=>v.active)
|
|
if(viewports.length > 0){
|
|
if(viewports.length > 0){
|
|
|
|
+
|
|
params.viewports = viewports
|
|
params.viewports = viewports
|
|
if(this.outlinePass.selectedObjects.length && this.outlinePass.edgeStrength > 0 && !params.screenshot
|
|
if(this.outlinePass.selectedObjects.length && this.outlinePass.edgeStrength > 0 && !params.screenshot
|
|
// || this.images360.fastTranMaskPass.enabled
|
|
// || this.images360.fastTranMaskPass.enabled
|
|
@@ -3667,7 +3721,14 @@ export class Viewer extends ViewerBase{
|
|
this.composer.render(scenes, null, this.viewports, this.renderDefault.bind(this));
|
|
this.composer.render(scenes, null, this.viewports, this.renderDefault.bind(this));
|
|
}else{
|
|
}else{
|
|
await this.renderDefault(params);
|
|
await this.renderDefault(params);
|
|
- }
|
|
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ {
|
|
|
|
+ let marks = performance.getEntriesByName("loop-start")
|
|
|
|
+ marks.length && (marks[marks.length-1].rendered = true )
|
|
|
|
+ }
|
|
|
|
+
|
|
}
|
|
}
|
|
if(!specialRender) this.needRender = false
|
|
if(!specialRender) this.needRender = false
|
|
}
|
|
}
|
|
@@ -5028,6 +5089,7 @@ export class Viewer extends ViewerBase{
|
|
this.stats.end();
|
|
this.stats.end();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ this.warnMemory()
|
|
|
|
|
|
viewer.addTimeMark('loop','end')
|
|
viewer.addTimeMark('loop','end')
|
|
viewer.addTimeMark('loopWaitNext','start')
|
|
viewer.addTimeMark('loopWaitNext','start')
|
|
@@ -5036,23 +5098,127 @@ export class Viewer extends ViewerBase{
|
|
//Potree.measureTimings = 1
|
|
//Potree.measureTimings = 1
|
|
}
|
|
}
|
|
|
|
|
|
- computeFps(){
|
|
|
|
|
|
+ warnMemory(){//内存高于2000可能崩溃
|
|
|
|
+ if(!performance.memory)return //国产麒麟firefox不支持
|
|
|
|
+ let size = performance.memory.usedJSHeapSize / 1e6
|
|
|
|
+ let minSize = 1500, maxSize = 3000, intervalTime = math.linearClamp(size, [minSize, maxSize*1.2], [20000, 3000])
|
|
|
|
+ if(size > minSize){
|
|
|
|
+ Potree.Common.intervalTool.isWaiting('processPriorityQueue', () => {
|
|
|
|
+ size = Math.round(size)
|
|
|
|
+ let L = math.linearClamp(size, [minSize, maxSize], [1, 0.5]); //L从白到红是1到0.5
|
|
|
|
+ Potree.Log('warning!内存告急!usedJSHeapSize:' + size , {
|
|
|
|
+ font: {
|
|
|
|
+ color: "#"+new THREE.Color().setHSL(0,1,L).getHexString()
|
|
|
|
+ }
|
|
|
|
+ })
|
|
|
|
+ }, intervalTime);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ computeFps11(){
|
|
let marks = performance.getEntriesByName("loop-start");
|
|
let marks = performance.getEntriesByName("loop-start");
|
|
- if(marks.length){//每次都获取最后一个加入列队。因为marks会定期清除,所以自己记录一个列队
|
|
|
|
-
|
|
|
|
|
|
+
|
|
|
|
+ let start = performance.now()
|
|
|
|
+ if(marks.length && !document.hidden){//每次都获取最后一个加入列队。因为marks会定期清除,所以自己记录一个列队。(hidden时手动loop的不会计入)
|
|
|
|
+
|
|
let last = marks[marks.length-1]
|
|
let last = marks[marks.length-1]
|
|
this.fpsCollect.push(last)
|
|
this.fpsCollect.push(last)
|
|
- if(this.fpsCollect.length>50){
|
|
|
|
|
|
+
|
|
|
|
+ let maxCount = 1000
|
|
|
|
+ if(this.fpsCollect.length>maxCount){
|
|
this.fpsCollect.splice(0,1)
|
|
this.fpsCollect.splice(0,1)
|
|
- }
|
|
|
|
- if(this.fpsCollect.length > 1){
|
|
|
|
- let dur = (last.startTime - this.fpsCollect[0].startTime) / 1000
|
|
|
|
- Potree.fps = this.fpsCollect.length / dur //有的手机高刷可以达到90以上
|
|
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ let getFps = (sampleCount, oldValue, requestRendered )=>{
|
|
|
|
+ let samples = this.fpsCollect.slice(-sampleCount)
|
|
|
|
+ let invalidTime = 0
|
|
|
|
+ let lastInvalid, invalidCount = 0
|
|
|
|
+ samples.forEach((frame,i)=>{ //扣除document.hidden时的时间
|
|
|
|
+ if((frame.pageHidden || requestRendered && !frame.rendered) && i!=samples.length-1){ //最后一个必须执行下面那段,最后再减1
|
|
|
|
+ invalidCount ++;
|
|
|
|
+ lastInvalid || (lastInvalid = frame)
|
|
|
|
+ }else{
|
|
|
|
+ if(lastInvalid){
|
|
|
|
+ invalidTime += frame.startTime - lastInvalid.startTime
|
|
|
|
+ lastInvalid = null
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ })
|
|
|
|
+
|
|
|
|
+ let dur = (last.startTime - samples[0].startTime - invalidTime) / 1000
|
|
|
|
+ let frameCount = samples.length - invalidCount - 1 //有效帧数
|
|
|
|
+ if(frameCount > 1){
|
|
|
|
+ if(requestRendered){
|
|
|
|
+ console.log(frameCount,dur,frameCount / dur)
|
|
|
|
+ }
|
|
|
|
+ return frameCount / dur //有的手机高刷可以达到90以上
|
|
|
|
+ }else{
|
|
|
|
+ return oldValue
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ Potree.fps = getFps(70, Potree.fps)//即时
|
|
|
|
+ Potree.fps2 = getFps(maxCount, Potree.fps2) //较长时段
|
|
|
|
+ Potree.fpsRendered = getFps(70, Potree.fpsRendered, true) //一般只有加载东西或渲染的时候才卡,所以渲染过的fps更有意义。 暂时无视地图或其他viewer的渲染 (但一段时间内不一定有渲染,所以不一定得到)
|
|
|
|
+ //缺点:调试时因暂停导致fps变低
|
|
}
|
|
}
|
|
|
|
+ Potree.lastComFpsDur = performance.now() - start
|
|
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ computeFps(){
|
|
|
|
+ let marks = performance.getEntriesByName("loop-start");
|
|
|
|
+
|
|
|
|
+ let start = performance.now()
|
|
|
|
+ if(marks.length && !document.hidden){//每次都获取最后一个加入列队。因为marks会定期清除,所以自己记录一个列队。(hidden时手动loop的不会计入)
|
|
|
|
+
|
|
|
|
+ let curFrame = marks[marks.length-1]
|
|
|
|
+
|
|
|
|
+ let lastFrame = this.fpsCollect.lastFrame
|
|
|
|
+ if(lastFrame && !lastFrame.pageHidden){
|
|
|
|
+ let desc = {
|
|
|
|
+ dur : curFrame.startTime - lastFrame.startTime
|
|
|
|
+ }
|
|
|
|
+ let joinIn = (name, maxCount)=>{
|
|
|
|
+ let collect = this.fpsCollect[name]
|
|
|
|
+ collect.push(desc)
|
|
|
|
+ collect.durSum += desc.dur
|
|
|
|
+ if(collect.length > maxCount){
|
|
|
|
+ collect.durSum -= collect[0].dur
|
|
|
|
+ collect.splice(0,1)
|
|
|
|
+ }
|
|
|
|
+ if(collect.length > 0){
|
|
|
|
+ collect.fps = collect.length / collect.durSum * 1000
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ joinIn('short',100)
|
|
|
|
+ joinIn('long',5000)
|
|
|
|
+ if(lastFrame.rendered){
|
|
|
|
+ joinIn('rendered',30), joinIn('renderedLong',300)
|
|
|
|
+ //lastFrame.cameraChanged && (joinIn('camChanged',30), joinIn('camChangedLong',300))
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ Potree.fps = this.fpsCollect.short.fps //即时
|
|
|
|
+ Potree.fps2 = this.fpsCollect.long.fps //较长时段
|
|
|
|
+ Potree.fpsRendered = this.fpsCollect.rendered.fps //一般只有加载东西或渲染的时候才卡,所以渲染过的fps更有意义。 暂时无视地图或其他viewer的渲染 (但一段时间内不一定有渲染,所以不一定得到)
|
|
|
|
+ Potree.fpsRendered2 = this.fpsCollect.renderedLong.fps
|
|
|
|
+ /* Potree.fpsCamChanged = this.fpsCollect.camChanged.fps
|
|
|
|
+ Potree.fpsCamChanged2 = this.fpsCollect.camChangedLong.fps */
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ curFrame.cameraChanged = this.lastFrameChanged
|
|
|
|
+ this.fpsCollect.lastFrame = curFrame
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ Potree.lastComFpsDur = performance.now() - start
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
postError(content, params = {}){
|
|
postError(content, params = {}){
|
|
let message = this.postMessage(content, params);
|
|
let message = this.postMessage(content, params);
|
|
|
|
|
|
@@ -5554,7 +5720,7 @@ export class Viewer extends ViewerBase{
|
|
options: {
|
|
options: {
|
|
//dracoDecoderPath: '../utils/loaders/DRACOLoader/draco',
|
|
//dracoDecoderPath: '../utils/loaders/DRACOLoader/draco',
|
|
//basisTranscoderPath: '../utils/loaders/KTX2Loader/basis',
|
|
//basisTranscoderPath: '../utils/loaders/KTX2Loader/basis',
|
|
- maximumScreenSpaceError: fileInfo.maximumScreenSpaceError || 80, //越小越清晰。 如果本身tiles很密很小这个值就不能很大。
|
|
|
|
|
|
+ maximumScreenSpaceError: fileInfo.maximumScreenSpaceError || 80 , //越小越清晰。 如果本身tiles很密很小这个值就不能很大。
|
|
//maxDepth: 100,
|
|
//maxDepth: 100,
|
|
//maximumMemoryUsage: 100, //缓存大小,见tiles3DMaxMemory。单位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
|
|
debug: browser.urlHasValue('tilesBox'), //show box
|