Skip to content

Commit 0832b21

Browse files
committed
fix(3d): revert WebGPURenderer to THREE.WebGLRenderer for R3F compatibility
WebGPURenderer (even with forceWebGL:true) requires async await renderer.init() before .render() can be called, but R3F Canvas only supports synchronous renderer creation. Reverted to THREE.WebGLRenderer which works with R3F's synchronous gl prop. WebGPU support deferred until R3F upstream adds async renderer initialization support.
1 parent 6f2411b commit 0832b21

2 files changed

Lines changed: 18 additions & 13 deletions

File tree

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,11 @@
1010
*
1111
* 降级策略:系统 reduced-motion / 性能 low 档 → degraded(减粒子),动画保留不静态化。
1212
*
13-
* @ai-context: Chronos 渲染容器;3D 粒子球 ChronosSphere,WebGPU 渲染后端(forceWebGL 回退)。
13+
* @ai-context: Chronos 渲染容器;3D 粒子球 ChronosSphere,WebGL 渲染后端。
1414
*/
1515
import { Canvas } from '@react-three/fiber';
1616
import { useRef, useState, memo } from 'react';
1717
import * as THREE from 'three';
18-
import WebGPURenderer from 'three/src/renderers/webgpu/WebGPURenderer.js';
1918
import { useSceneTheme } from '@/lib/3d/hooks/useSceneTheme';
2019
import { useReducedMotion } from '@/hooks/useReducedMotion';
2120
import { usePerformanceModeStore } from '@/lib/performance/usePerformanceMode';
@@ -127,9 +126,13 @@ export const ChronosCanvas = memo(function ChronosCanvas({
127126
role="timer"
128127
aria-label={timeStr}
129128
>
130-
{/* 3D 粒子球(R3F + WebGPU;THREE.Points 高效渲染,canvas 填满容器) */}
129+
{/* 3D 粒子球(R3F + WebGL;THREE.Points 高效渲染,canvas 填满容器) */}
131130
<Canvas
132-
gl={(c) => new WebGPURenderer({ canvas: c, antialias: true, alpha: true, stencil: false, forceWebGL: true })}
131+
gl={{
132+
antialias: true,
133+
alpha: true,
134+
stencil: false,
135+
}}
133136
dpr={[1, degraded ? 1 : 1.5]}
134137
camera={{ fov: 50, near: 0.1, far: 20, position: [0, 0, 4.5] }}
135138
style={{ position: 'absolute', inset: 0, width: '100%', height: '100%', background: 'transparent' }}

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

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@
2020
*
2121
* @ai-context: 3D 场景核心(R3F):SceneProvider。
2222
*
23-
* 注意:当前使用 forceWebGL=true 以同步初始化。R3F 尚不支持异步
24-
* WebGPU 渲染器初始化(await renderer.init()),待上游支持后移除该选项。
23+
* 渲染后端:使用 THREE.WebGLRenderer(R3F 目前不支持异步渲染器初始化,
24+
* 待上游支持后切换回 WebGPURenderer)。
2525
*/
2626
import { Canvas, useThree } from '@react-three/fiber';
2727
import { Suspense, useEffect, useLayoutEffect, useState } from 'react';
@@ -35,7 +35,6 @@ import { usePerformanceModeStore } from '@/lib/performance/usePerformanceMode';
3535
import { PERFORMANCE_MODE_CONFIG } from '@/lib/performance/performanceMode';
3636
import { useSceneTheme } from '../hooks/useSceneTheme';
3737
import * as THREE from 'three';
38-
import WebGPURenderer from 'three/src/renderers/webgpu/WebGPURenderer.js';
3938

4039
interface SceneProviderProps {
4140
children: React.ReactNode;
@@ -187,13 +186,12 @@ export function SceneProvider({ children, interactive = false }: SceneProviderPr
187186
<div className="fixed inset-0 z-0" style={{ pointerEvents: interactive ? 'auto' : 'none' }}>
188187
<Canvas
189188
frameloop={frameloop}
190-
gl={(canvas) => new WebGPURenderer({
191-
canvas,
189+
gl={{
192190
antialias: true,
193191
alpha: true,
192+
powerPreference: 'high-performance',
194193
stencil: false,
195-
forceWebGL: true,
196-
})}
194+
}}
197195
camera={{ fov: 60, near: 0.1, far: 1000, position: [0, 0, 10] }}
198196
dpr={[1, 2]}
199197
style={{ background: 'transparent' }}
@@ -207,8 +205,12 @@ export function SceneProvider({ children, interactive = false }: SceneProviderPr
207205
// gl.shadowMap.type = THREE.PCFSoftShadowMap;
208206
// 注意:fog 和 background 由 ThemeAwareEnvironment 组件管理(主题感知)
209207
// GPU 诊断:打印实际渲染器名称,出现 SwiftShader 即说明落入软件渲染(硬件加速失效)
210-
const backendName = (gl as any).backend?.constructor?.name ?? 'unknown';
211-
console.info('[3D] Renderer backend:', backendName);
208+
const ctx = gl.getContext();
209+
const dbgExt = ctx.getExtension('WEBGL_debug_renderer_info');
210+
const rendererName = dbgExt
211+
? ctx.getParameter(dbgExt.UNMASKED_RENDERER_WEBGL)
212+
: ctx.getParameter(ctx.RENDERER);
213+
console.info('[3D] WebGL renderer:', rendererName);
212214
}}
213215
>
214216
{/* FPS 自动降档仅在概览态测量(entering 飞行帧率不代表设备能力,docked 无帧率可言) */}

0 commit comments

Comments
 (0)