From 56c2e1c9895c119aa4478b967121b0700c6c1601 Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Wed, 15 Apr 2026 16:50:12 +0900 Subject: [PATCH] Update engine.ts --- packages/frontend/src/utility/room/engine.ts | 38 +++++++++++++------- 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/packages/frontend/src/utility/room/engine.ts b/packages/frontend/src/utility/room/engine.ts index cf06eb165d..5422bf34b2 100644 --- a/packages/frontend/src/utility/room/engine.ts +++ b/packages/frontend/src/utility/room/engine.ts @@ -499,7 +499,8 @@ export class RoomEngine extends EventEmitter { } public isSitting = false; - private fps = 60; + private fps: number | null = 30; + private disposed = false; public domEvents: EventEmitter<{ 'click': (event: { offsetX: number; offsetY: number; }) => void; @@ -735,18 +736,30 @@ export class RoomEngine extends EventEmitter { //const sphere = BABYLON.MeshBuilder.CreateSphere('sphere', { diameter: cm(1) }, this.scene); - const frameInterval = 1000 / this.fps; - let lastTime = performance.now(); - - this.engine.runRenderLoop(() => { - const currentTime = performance.now(); - const delta = currentTime - lastTime; - - if (delta >= frameInterval) { + if (this.fps == null) { + this.engine.runRenderLoop(() => { this.scene.render(); - lastTime = currentTime - (delta % frameInterval); - } - }); + }); + } else { + let then = 0; + const interval = 1000 / this.fps; + + const renderLoop = (timeStamp: number) => { + if (this.disposed) return; + + window.requestAnimationFrame(renderLoop); + + const delta = timeStamp - then; + if (delta <= interval) return; + then = timeStamp - (delta % interval); + + this.engine.beginFrame(); + this.scene.render(); + this.engine.endFrame(); + }; + + window.requestAnimationFrame(renderLoop); + } if (SNAPSHOT_RENDERING) { const sr = new BABYLON.SnapshotRenderingHelper(this.scene); @@ -1882,6 +1895,7 @@ export class RoomEngine extends EventEmitter { this.intervalIds = []; this.timeoutIds = []; this.engine.dispose(); + this.disposed = true; } }