Skip to content

Commit 5c3b01c

Browse files
committed
fix(3d): add forceWebGL=true to WebGPURenderer for async init compatibility
Three.js WebGPURenderer requires async await renderer.init() before .render() can be called, but R3F Canvas gl prop is synchronous. Added forceWebGL: true to use the WebGL2 backend which initializes synchronously, avoiding the 'Renderer.render() called before backend initialized' error. Revert to native WebGPU when R3F supports async renderer initialization.
1 parent 0e9dc4a commit 5c3b01c

2 files changed

Lines changed: 6 additions & 2 deletions

File tree

‎client/src/features/pomodoro/components/chronos/ChronosCanvas.tsx‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
*
1111
* 降级策略:系统 reduced-motion / 性能 low 档 → degraded(减粒子),动画保留不静态化。
1212
*
13-
* @ai-context: Chronos 渲染容器;3D 粒子球 ChronosSphere,WebGPU 渲染后端。
13+
* @ai-context: Chronos 渲染容器;3D 粒子球 ChronosSphere,WebGPU 渲染后端(forceWebGL 回退)。
1414
*/
1515
import { Canvas } from '@react-three/fiber';
1616
import { useRef, useState, memo } from 'react';
@@ -129,7 +129,7 @@ export const ChronosCanvas = memo(function ChronosCanvas({
129129
>
130130
{/* 3D 粒子球(R3F + WebGPU;THREE.Points 高效渲染,canvas 填满容器) */}
131131
<Canvas
132-
gl={(c) => new WebGPURenderer({ canvas: c, antialias: true, alpha: true, stencil: false })}
132+
gl={(c) => new WebGPURenderer({ canvas: c, antialias: true, alpha: true, stencil: false, forceWebGL: true })}
133133
dpr={[1, degraded ? 1 : 1.5]}
134134
camera={{ fov: 50, near: 0.1, far: 20, position: [0, 0, 4.5] }}
135135
style={{ position: 'absolute', inset: 0, width: '100%', height: '100%', background: 'transparent' }}

‎client/src/lib/3d/core/SceneProvider.tsx‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@
1919
* 需由 LoopResumer 在相位迁移后显式唤醒,否则多次切换后画面永久冻结。
2020
*
2121
* @ai-context: 3D 场景核心(R3F):SceneProvider。
22+
*
23+
* 注意:当前使用 forceWebGL=true 以同步初始化。R3F 尚不支持异步
24+
* WebGPU 渲染器初始化(await renderer.init()),待上游支持后移除该选项。
2225
*/
2326
import { Canvas, useThree } from '@react-three/fiber';
2427
import { Suspense, useEffect, useLayoutEffect, useState } from 'react';
@@ -189,6 +192,7 @@ export function SceneProvider({ children, interactive = false }: SceneProviderPr
189192
antialias: true,
190193
alpha: true,
191194
stencil: false,
195+
forceWebGL: true,
192196
})}
193197
camera={{ fov: 60, near: 0.1, far: 1000, position: [0, 0, 10] }}
194198
dpr={[1, 2]}

0 commit comments

Comments
 (0)