diff --git a/package.json b/package.json index 3a9e2bc2..38afa8bf 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,7 @@ }, "pnpm": { "overrides": { - "@galacean/engine": ">=1.6.0-0" + "@galacean/engine": ">=2.0.0-0" } } } diff --git a/packages/auxiliary-lines/package.json b/packages/auxiliary-lines/package.json index 2f91cbe3..f9268ec0 100644 --- a/packages/auxiliary-lines/package.json +++ b/packages/auxiliary-lines/package.json @@ -24,7 +24,7 @@ "types/**/*" ], "peerDependencies": { - "@galacean/engine": ">=1.6.0-0" + "@galacean/engine": ">=2.0.0-0" }, "dependencies": { "@galacean/engine-toolkit-custom-material": "workspace:*" diff --git a/packages/controls/package.json b/packages/controls/package.json index 880a6310..7c1f11c1 100644 --- a/packages/controls/package.json +++ b/packages/controls/package.json @@ -24,6 +24,6 @@ "types/**/*" ], "peerDependencies": { - "@galacean/engine": ">=1.6.0-0" + "@galacean/engine": ">=2.0.0-0" } } diff --git a/packages/custom-gltf-parser/package.json b/packages/custom-gltf-parser/package.json index f78ba575..9709d184 100755 --- a/packages/custom-gltf-parser/package.json +++ b/packages/custom-gltf-parser/package.json @@ -23,6 +23,6 @@ "types/**/*" ], "peerDependencies": { - "@galacean/engine": ">=1.6.0-0" + "@galacean/engine": ">=2.0.0-0" } } diff --git a/packages/custom-material/package.json b/packages/custom-material/package.json index 6e0747d1..e89609b2 100644 --- a/packages/custom-material/package.json +++ b/packages/custom-material/package.json @@ -24,6 +24,6 @@ "types/**/*" ], "peerDependencies": { - "@galacean/engine": ">=1.6.0-0" + "@galacean/engine": ">=2.0.0-0" } } diff --git a/packages/draco/package.json b/packages/draco/package.json index de733502..606ea65d 100644 --- a/packages/draco/package.json +++ b/packages/draco/package.json @@ -20,6 +20,6 @@ "types/**/*" ], "dependencies": { - "@galacean/engine": ">=1.6.0-0" + "@galacean/engine": ">=2.0.0-0" } } diff --git a/packages/dynamic-bone/package.json b/packages/dynamic-bone/package.json index e004a40e..8b29eb71 100644 --- a/packages/dynamic-bone/package.json +++ b/packages/dynamic-bone/package.json @@ -24,6 +24,6 @@ "types/**/*" ], "peerDependencies": { - "@galacean/engine": ">=1.6.0-0" + "@galacean/engine": ">=2.0.0-0" } } diff --git a/packages/framebuffer-picker/package.json b/packages/framebuffer-picker/package.json index 0b27e2d1..29ed9110 100755 --- a/packages/framebuffer-picker/package.json +++ b/packages/framebuffer-picker/package.json @@ -23,6 +23,6 @@ "types/**/*" ], "peerDependencies": { - "@galacean/engine": ">=1.6.0-0" + "@galacean/engine": ">=2.0.0-0" } } diff --git a/packages/geometry-sketch/package.json b/packages/geometry-sketch/package.json index 96d67fc5..7dc338d4 100644 --- a/packages/geometry-sketch/package.json +++ b/packages/geometry-sketch/package.json @@ -24,6 +24,6 @@ "types/**/*" ], "peerDependencies": { - "@galacean/engine": ">=1.6.0-0" + "@galacean/engine": ">=2.0.0-0" } } diff --git a/packages/gizmo/package.json b/packages/gizmo/package.json index a13e5d03..beb369f4 100644 --- a/packages/gizmo/package.json +++ b/packages/gizmo/package.json @@ -24,8 +24,8 @@ "types/**/*" ], "peerDependencies": { - "@galacean/engine": ">=1.6.0-0", - "@galacean/engine-ui": ">=1.6.0-0" + "@galacean/engine": ">=2.0.0-0", + "@galacean/engine-ui": ">=2.0.0-0" }, "dependencies": { "@galacean/engine-toolkit-framebuffer-picker": "workspace:*", diff --git a/packages/input-logger/package.json b/packages/input-logger/package.json index ff827e39..e9ee20bb 100644 --- a/packages/input-logger/package.json +++ b/packages/input-logger/package.json @@ -24,6 +24,6 @@ "types/**/*" ], "peerDependencies": { - "@galacean/engine": ">=1.6.0-0" + "@galacean/engine": ">=2.0.0-0" } } diff --git a/packages/lines/package.json b/packages/lines/package.json index 7e3dc31e..979991e2 100644 --- a/packages/lines/package.json +++ b/packages/lines/package.json @@ -24,6 +24,6 @@ "types/**/*" ], "peerDependencies": { - "@galacean/engine": ">=1.6.0-0" + "@galacean/engine": ">=2.0.0-0" } } diff --git a/packages/navigation-gizmo/package.json b/packages/navigation-gizmo/package.json index 92fe91a9..2ec70043 100644 --- a/packages/navigation-gizmo/package.json +++ b/packages/navigation-gizmo/package.json @@ -24,7 +24,7 @@ "types/**/*" ], "peerDependencies": { - "@galacean/engine": ">=1.6.0-0" + "@galacean/engine": ">=2.0.0-0" }, "dependencies": { "@galacean/engine-toolkit-controls": "workspace:*", diff --git a/packages/outline/package.json b/packages/outline/package.json index fcaa55fe..9897b457 100755 --- a/packages/outline/package.json +++ b/packages/outline/package.json @@ -23,6 +23,6 @@ "types/**/*" ], "peerDependencies": { - "@galacean/engine": ">=1.6.0-0" + "@galacean/engine": ">=2.0.0-0" } } diff --git a/packages/skeleton-viewer/package.json b/packages/skeleton-viewer/package.json index 5129a12f..05878789 100755 --- a/packages/skeleton-viewer/package.json +++ b/packages/skeleton-viewer/package.json @@ -23,6 +23,6 @@ "types/**/*" ], "peerDependencies": { - "@galacean/engine": ">=1.6.0-0" + "@galacean/engine": ">=2.0.0-0" } } diff --git a/packages/stats/README.md b/packages/stats/README.md index 08d2ad84..e30f0869 100644 --- a/packages/stats/README.md +++ b/packages/stats/README.md @@ -3,14 +3,15 @@ Statistics toolkit to gather performance data ## Features -- fps: frame rate; -- memory: CPU memory; +- fps: frame rate; +- JS Memory: JS heap memory (MB); +- totalGraphicsMemory: total graphics memory (MB); +- textureMemory: texture memory (MB); +- bufferMemory: buffer memory (MB); - drawCall: draw call count; - triangles: triangle count; - lines: line count; - points: point count; -- textures: texture count; -- shaders: shader count; - webglContext: webgl context type; ## npm diff --git a/packages/stats/package.json b/packages/stats/package.json index 01670581..96e3ad49 100755 --- a/packages/stats/package.json +++ b/packages/stats/package.json @@ -23,6 +23,6 @@ "types/**/*" ], "peerDependencies": { - "@galacean/engine": ">=1.6.0-0" + "@galacean/engine": ">=2.0.0-0" } } diff --git a/packages/stats/src/Core.ts b/packages/stats/src/Core.ts index 709b2c6f..35283060 100644 --- a/packages/stats/src/Core.ts +++ b/packages/stats/src/Core.ts @@ -1,7 +1,6 @@ +import { Engine } from "@galacean/engine"; import DrawCallHook from "./hooks/DrawCallHook"; -import { RequestHook } from "./hooks/RequestHook"; -import ShaderHook from "./hooks/ShaderHook"; -import TextureHook from "./hooks/TextureHook"; + declare global { interface Performance { @@ -14,25 +13,24 @@ declare global { */ export class Core { private readonly gl: WebGLRenderingContext | WebGL2RenderingContext; + private readonly engine: Engine; private drawCallHook: DrawCallHook; - private textureHook: TextureHook; - private shaderHook: ShaderHook; - private requestHook: RequestHook; + private samplingFrames: number = 60; private samplingIndex: number = 0; private updateCounter: number = 0; private updateTime: number = 0; - constructor(gl: WebGLRenderingContext | WebGL2RenderingContext) { + constructor(engine: Engine) { + // @ts-ignore + const gl = engine._hardwareRenderer.gl; this.gl = gl; + this.engine = engine; this.hook(gl); } private hook(gl: WebGLRenderingContext | WebGL2RenderingContext): void { this.drawCallHook = new DrawCallHook(gl); - this.textureHook = new TextureHook(gl); - this.shaderHook = new ShaderHook(gl); - this.requestHook = new RequestHook(); } /** @@ -47,8 +45,6 @@ export class Core { */ public release(): void { this.drawCallHook && this.drawCallHook.release(); - this.textureHook && this.textureHook.release(); - this.shaderHook && this.shaderHook.release(); } /** @@ -69,6 +65,7 @@ export class Core { this.samplingIndex = 0; + const renderingStatistics = this.engine.renderingStatistics; let data: PerformanceData = { fps: Math.round((this.updateCounter * 1000) / (now - this.updateTime)), memory: performance.memory && (performance.memory.usedJSHeapSize / 1048576) >> 0, @@ -76,9 +73,9 @@ export class Core { triangles: this.drawCallHook.triangles, lines: this.drawCallHook.lines, points: this.drawCallHook.points, - textures: this.textureHook.textures, - size: this.requestHook.size, - shaders: this.shaderHook.shaders, + textureMemory: formatBytes(renderingStatistics.textureMemory), + bufferMemory: formatBytes(renderingStatistics.bufferMemory), + totalGraphicsMemory: formatBytes(renderingStatistics.totalMemory), webglContext: window.hasOwnProperty("WebGL2RenderingContext") && this.gl instanceof WebGL2RenderingContext ? "2.0" : "1.0" }; @@ -99,8 +96,13 @@ interface PerformanceData { triangles: number; lines: number; points: number; - textures: number; - shaders: number; - size: string; + textureMemory: string; + bufferMemory: string; + totalGraphicsMemory: string; webglContext: string; } + +function formatBytes(bytes: number): string { + const mb = bytes / 1048576; + return mb.toFixed(2); +} diff --git a/packages/stats/src/Monitor.ts b/packages/stats/src/Monitor.ts index d4ccdc9a..13ed1225 100644 --- a/packages/stats/src/Monitor.ts +++ b/packages/stats/src/Monitor.ts @@ -1,22 +1,23 @@ +import { Engine } from "@galacean/engine"; import { Core } from "./Core"; let tpl = `
FPS
0
-
Memory (MB)
+
JS Memory (MB)
0
-
DrawCall
+
Total Graphics Memory (MB)
0
-
Triangles
+
Texture Memory (MB)
0
-
Textures
+
Buffer Memory (MB)
0
-
Shaders
+
DrawCall
0
-
Network Size (MB)
+
Triangles
0
-
WebGL
+
WebGL
`; @@ -53,6 +54,7 @@ let css = ` font-size: ${20 / 7.5}vh; padding: ${10 / 7.5}vh 0 ${10 / 7.5}vh; } + `; export default class Monitor { @@ -61,10 +63,10 @@ export default class Monitor { private container: HTMLElement; private readonly items: string[]; - constructor(gl: WebGLRenderingContext | WebGL2RenderingContext) { - this.core = new Core(gl); + constructor(engine: Engine) { + this.core = new Core(engine); this.items = []; - this.items = ["fps", "memory", "drawCall", "triangles", "textures", "shaders", "size", "webglContext"]; + this.items = ["fps", "memory", "totalGraphicsMemory", "textureMemory", "bufferMemory", "drawCall", "triangles", "webglContext"]; this.createContainer(); this.update = this.update.bind(this); } diff --git a/packages/stats/src/Stats.ts b/packages/stats/src/Stats.ts index 1413d30c..1b7825af 100644 --- a/packages/stats/src/Stats.ts +++ b/packages/stats/src/Stats.ts @@ -1,5 +1,4 @@ import { Script, Camera } from "@galacean/engine"; -import { hookRequest } from "./hooks/RequestHook"; import Monitor from "./Monitor"; /** @@ -7,18 +6,12 @@ import Monitor from "./Monitor"; */ export class Stats extends Script { private monitor: Monitor; - private camera: Camera; - - static hookRequest() { - hookRequest(); - } override set enabled(value: boolean) { value ? this._setupMonitor() : this.monitor.destroy(); } override onBeginRender(camera: Camera): void { - this.camera = camera; if (!this.monitor) { this._setupMonitor(); } @@ -31,10 +24,6 @@ export class Stats extends Script { } private _setupMonitor() { - // @ts-ignore - const gl = this.camera.engine._hardwareRenderer.gl; - if (gl) { - this.monitor = new Monitor(gl); - } + this.monitor = new Monitor(this.engine); } } diff --git a/packages/stats/src/hooks/RequestHook.ts b/packages/stats/src/hooks/RequestHook.ts deleted file mode 100644 index 2376650e..00000000 --- a/packages/stats/src/hooks/RequestHook.ts +++ /dev/null @@ -1,86 +0,0 @@ -let requestSize = 0; - -export function hookRequest() { - let originalSend = XMLHttpRequest.prototype.send; - - const cacheMap = new Map(); - function addRequestSize(url: string, size: number) { - if (cacheMap.get(url) == undefined) { - cacheMap.set(url, size); - requestSize += size; - } - } - - XMLHttpRequest.prototype.send = function (body) { - this.addEventListener( - "load", - function () { - let size = 0; - if (this.responseType === "" || this.responseType === "text") { - size = new Blob([JSON.stringify(this.responseText)]).size; - } else if (this.response instanceof Blob) { - size = this.response.size; - } else if (this.response instanceof ArrayBuffer) { - size = this.response.byteLength; - } else if (this.responseType === "json") { - size = new Blob([JSON.stringify(this.response)]).size; - } - - addRequestSize((this as XMLHttpRequest).responseURL, size); - }, - false - ); - - originalSend.call(this, body); - - var originalImageSrc = Object.getOwnPropertyDescriptor(Image.prototype, "src").set; - - this.originalImageSrc = originalImageSrc; - - Object.defineProperty(Image.prototype, "src", { - set: function (value) { - fetch(value).then((response) => { - if (response.ok) { - response.blob().then((blob) => { - addRequestSize((this as XMLHttpRequest).responseURL, blob.size); - }); - } - }); - originalImageSrc.call(this, value); - } - }); - }; -} - -export class RequestHook { - private _originalSend; - private _hooked = false; - - get size() { - return formatNumber(requestSize / 1024 / 1024); - } - - constructor() { - this._hooked = true; - } - - public reset(): void { - requestSize = 0; - } - - public release(): void { - if (this._hooked) { - XMLHttpRequest.prototype.send = this._originalSend; - Object.defineProperty(Image.prototype, "src", { - set: function (value) { - this.src.call(this, value); - } - }); - } - this._hooked = false; - } -} - -function formatNumber(num: number): string { - return Number(num).toFixed(Math.max(6 - num.toString().split(".")[0].length, 0)); -} diff --git a/packages/stats/src/hooks/ShaderHook.ts b/packages/stats/src/hooks/ShaderHook.ts deleted file mode 100644 index 86b28464..00000000 --- a/packages/stats/src/hooks/ShaderHook.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { log } from "../log"; - -/** - * @class ShaderHook - */ -export default class ShaderHook { - public shaders: number = 0; - private readonly realAttachShader: any; - private readonly realDetachShader: any; - private readonly gl: WebGLRenderingContext | WebGL2RenderingContext; - private hooked: boolean; - - constructor(gl: WebGLRenderingContext | WebGL2RenderingContext) { - this.realAttachShader = gl.attachShader; - this.realDetachShader = gl.detachShader; - - gl.attachShader = this.hookedAttachShader.bind(this); - gl.detachShader = this.hookedDetachShader.bind(this); - - this.hooked = true; - this.gl = gl; - - log(`Shader is hooked.`); - } - - private hookedAttachShader(program: any, shader: any): void { - this.realAttachShader.call(this.gl, program, shader); - - this.shaders++; - - log(`AttachShader:`, shader, `shaders: ${this.shaders}`); - } - - private hookedDetachShader(program: any, shader: any): void { - this.realDetachShader.call(this.gl, program, shader); - - this.shaders--; - - log(`DetachShader. shaders: ${this.shaders}`); - } - - public reset(): void { - this.shaders = 0; - } - - public release(): void { - if (this.hooked) { - this.gl.attachShader = this.realAttachShader; - this.gl.detachShader = this.realDetachShader; - } - - this.hooked = false; - } -} diff --git a/packages/stats/src/hooks/TextureHook.ts b/packages/stats/src/hooks/TextureHook.ts deleted file mode 100644 index 9eed2fb5..00000000 --- a/packages/stats/src/hooks/TextureHook.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { log } from "../log"; - -/** - * @class TextureHook - */ -export default class TextureHook { - public textures: number = 0; - private readonly realCreateTexture: any; - private readonly realDeleteTexture: any; - private readonly gl: WebGLRenderingContext | WebGL2RenderingContext; - private hooked: boolean; - - constructor(gl: WebGLRenderingContext | WebGL2RenderingContext) { - this.realCreateTexture = gl.createTexture; - this.realDeleteTexture = gl.deleteTexture; - - gl.createTexture = this.hookedCreateTexture.bind(this); - gl.deleteTexture = this.hookedDeleteTexture.bind(this); - - this.hooked = true; - this.gl = gl; - - log(`Texture is hooked.`); - } - - private hookedCreateTexture(): void { - let texture = this.realCreateTexture.call(this.gl); - - this.textures++; - - log(`CreateTexture:`, texture, `textures: ${this.textures}`); - - return texture; - } - - private hookedDeleteTexture(texture: any): void { - this.realDeleteTexture.call(this.gl, texture); - - this.textures--; - - log(`DeleteTexture. textures: ${this.textures}`); - } - - public reset(): void { - this.textures = 0; - } - - public release(): void { - if (this.hooked) { - this.gl.createTexture = this.realCreateTexture; - this.gl.deleteTexture = this.realDeleteTexture; - } - - this.hooked = false; - } -} diff --git a/packages/tween/package.json b/packages/tween/package.json index 76287a8a..32aad9ab 100644 --- a/packages/tween/package.json +++ b/packages/tween/package.json @@ -23,6 +23,6 @@ "types/**/*" ], "peerDependencies": { - "@galacean/engine": ">=1.6.0-0" + "@galacean/engine": ">=2.0.0-0" } } diff --git a/packages/way-point/package.json b/packages/way-point/package.json index 24ce671e..29c47e65 100755 --- a/packages/way-point/package.json +++ b/packages/way-point/package.json @@ -24,6 +24,6 @@ "types/**/*" ], "peerDependencies": { - "@galacean/engine": ">=1.6.0-0" + "@galacean/engine": ">=2.0.0-0" } } diff --git a/packages/xr/package.json b/packages/xr/package.json index 8b5666bc..3e832c95 100644 --- a/packages/xr/package.json +++ b/packages/xr/package.json @@ -32,7 +32,7 @@ "types/**/*" ], "peerDependencies": { - "@galacean/engine": ">=1.6.0-0", - "@galacean/engine-xr": ">=1.6.0-0" + "@galacean/engine": ">=2.0.0-0", + "@galacean/engine-xr": ">=2.0.0-0" } } diff --git a/tests/package.json b/tests/package.json index e5d4894e..cfe836f8 100644 --- a/tests/package.json +++ b/tests/package.json @@ -14,7 +14,7 @@ "types/**/*" ], "dependencies": { - "@galacean/engine": ">=1.6.0-0", + "@galacean/engine": ">=2.0.0-0", "@galacean/engine-toolkit-auxiliary-lines": "workspace:*", "@galacean/engine-toolkit-controls": "workspace:*", "@galacean/engine-toolkit-framebuffer-picker": "workspace:*"