118 lines
2.9 KiB
TypeScript
118 lines
2.9 KiB
TypeScript
/**
|
||
* 性能状态监视器,基于stats.js
|
||
* 默认展示全部面板
|
||
*/
|
||
import ThreeStats from 'three/examples/jsm/libs/stats.module.js';
|
||
import Viewer from "@/core/viewer/Viewer.ts";
|
||
|
||
export class Stats {
|
||
private viewer: Viewer;
|
||
private threeStats: ThreeStats;
|
||
private panel = 0;
|
||
private _visible = true;
|
||
|
||
private fns:{
|
||
beforeRender:null | (() => void);
|
||
afterRender:null | (() => void);
|
||
} = {
|
||
beforeRender: null,
|
||
afterRender: null,
|
||
}
|
||
|
||
constructor(viewer: Viewer) {
|
||
this.viewer = viewer;
|
||
this.threeStats = new ThreeStats();
|
||
|
||
this.initEvent();
|
||
|
||
this.init();
|
||
}
|
||
|
||
get domElement():HTMLElement {
|
||
return this.threeStats.dom;
|
||
}
|
||
|
||
get visible(){
|
||
return this._visible;
|
||
}
|
||
|
||
set visible(visible:boolean) {
|
||
this._visible = visible;
|
||
|
||
this.domElement.style.display = visible ? "block" : 'none';
|
||
}
|
||
|
||
initEvent(){
|
||
this.fns.beforeRender = () => {
|
||
if(!this.visible) return;
|
||
|
||
this.threeStats.begin();
|
||
};
|
||
this.viewer.addEventListener("beforeRender",this.fns.beforeRender);
|
||
|
||
this.fns.afterRender = () => {
|
||
if(!this.visible) return;
|
||
|
||
this.threeStats.end();
|
||
};
|
||
this.viewer.addEventListener("afterRender",this.fns.afterRender);
|
||
}
|
||
|
||
init(){
|
||
const canvases = this.domElement.querySelectorAll("canvas");
|
||
canvases.forEach(canvas => {
|
||
canvas.style.width = "5rem";
|
||
canvas.style.height = "3rem";
|
||
canvas.style.display = "block";
|
||
});
|
||
}
|
||
|
||
showPanel(type: number | 'fps' | 'ms' | 'mb') {
|
||
if (typeof type === 'number') {
|
||
this.threeStats.showPanel(type);
|
||
this.panel = type;
|
||
return;
|
||
}
|
||
|
||
switch (type.toLowerCase()) {
|
||
case 'fps':
|
||
this.threeStats.showPanel(0);
|
||
this.panel = 0;
|
||
break;
|
||
case 'ms':
|
||
this.threeStats.showPanel(1);
|
||
this.panel = 1;
|
||
break;
|
||
case 'mb':
|
||
this.threeStats.showPanel(2);
|
||
this.panel = 2;
|
||
break;
|
||
}
|
||
}
|
||
|
||
showAllPanels(show:boolean) {
|
||
const canvases = this.domElement.querySelectorAll("canvas");
|
||
canvases.forEach(canvas => {
|
||
canvas.style.display = show ? "block" : "none";
|
||
});
|
||
|
||
if(!show){
|
||
this.showPanel(this.panel);
|
||
}
|
||
}
|
||
|
||
dispose(){
|
||
if(this.fns.beforeRender){
|
||
this.viewer.removeEventListener("beforeRender",this.fns.beforeRender);
|
||
this.fns.beforeRender = null;
|
||
}
|
||
|
||
if(this.fns.afterRender){
|
||
this.viewer.removeEventListener("afterRender",this.fns.afterRender);
|
||
this.fns.afterRender = null;
|
||
}
|
||
|
||
// @ts-ignore
|
||
this.threeStats = null;
|
||
}
|
||
} |