From d3eb3867bdfea6ebc71170f53b87deb1adcf8a7f Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Sat, 16 May 2026 10:49:25 +0900 Subject: [PATCH] handle lost event --- .../src/world/engineControllerBase.ts | 30 ++++++++++++++----- .../src/world/room/previewEngineWorker.ts | 3 ++ packages/frontend/src/world/room/worker.ts | 3 ++ 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/packages/frontend/src/world/engineControllerBase.ts b/packages/frontend/src/world/engineControllerBase.ts index e155467442..805b8aa20a 100644 --- a/packages/frontend/src/world/engineControllerBase.ts +++ b/packages/frontend/src/world/engineControllerBase.ts @@ -70,6 +70,10 @@ export abstract class EngineControllerBase { } break; } + case 'contextlost': { + this.onContextLost(); + break; + } default: { console.warn('Unrecognized message from worker:', event.data?.type); } @@ -79,14 +83,18 @@ export abstract class EngineControllerBase { const babylonEngine = new BABYLON.WebGPUEngine(canvas, { doNotHandleContextLost: true, powerPreference: 'high-performance', antialias: this.options.antialias }); babylonEngine.compatibilityMode = false; babylonEngine.enableOfflineSupport = false; - babylonEngine.onContextLostObservable.add(() => { - os.alert({ - type: 'error', - title: i18n.ts.somethingHappened, - text: i18n.ts._miWorld.crushed_description, - }); - }); await babylonEngine.initAsync(); + // doNotHandleContextLostがtrueだとそもそも呼ばれない + //babylonEngine.onContextLostObservable.add(() => { + // os.alert({ + // type: 'error', + // title: i18n.ts.somethingHappened, + // text: i18n.ts._miWorld.crushed_description, + // }); + //}); + babylonEngine._device.lost.then(() => { // TODO: babylonEngineの内部プロパティに依存しない方法をforumで聞く + this.onContextLost(); + }); if (this.options.resolution === 2) babylonEngine.setHardwareScalingLevel(0.5); if (this.options.resolution === 0.5) babylonEngine.setHardwareScalingLevel(2); @@ -270,6 +278,14 @@ export abstract class EngineControllerBase { this.initializeProgress.value = 0; } + private onContextLost() { + os.alert({ + type: 'error', + title: i18n.ts.somethingHappened, + text: i18n.ts._miWorld.crushed_description, + }); + } + private callCounter = 0; protected call(fn: FN, args: Parameters = [] as any): void { diff --git a/packages/frontend/src/world/room/previewEngineWorker.ts b/packages/frontend/src/world/room/previewEngineWorker.ts index 644eb16ac0..5d0615e1c1 100644 --- a/packages/frontend/src/world/room/previewEngineWorker.ts +++ b/packages/frontend/src/world/room/previewEngineWorker.ts @@ -20,6 +20,9 @@ onmessage = async (event) => { babylonEngine.compatibilityMode = false; babylonEngine.enableOfflineSupport = false; await babylonEngine.initAsync(); + babylonEngine._device.lost.then(() => { // TODO: babylonEngineの内部プロパティに依存しない方法をforumで聞く + self.postMessage({ type: 'contextlost' }); + }); if (event.data.options.resolution === 2) babylonEngine.setHardwareScalingLevel(0.5); if (event.data.options.resolution === 0.5) babylonEngine.setHardwareScalingLevel(2); diff --git a/packages/frontend/src/world/room/worker.ts b/packages/frontend/src/world/room/worker.ts index 078c647033..63a914a9f5 100644 --- a/packages/frontend/src/world/room/worker.ts +++ b/packages/frontend/src/world/room/worker.ts @@ -24,6 +24,9 @@ onmessage = async (event) => { babylonEngine.compatibilityMode = false; babylonEngine.enableOfflineSupport = false; await babylonEngine.initAsync(); + babylonEngine._device.lost.then(() => { // TODO: babylonEngineの内部プロパティに依存しない方法をforumで聞く + self.postMessage({ type: 'contextlost' }); + }); if (event.data.options.resolution === 2) babylonEngine.setHardwareScalingLevel(0.5); if (event.data.options.resolution === 0.5) babylonEngine.setHardwareScalingLevel(2);