OES_texture_float_linear 错误我们刚刚添加了 key={currentFilm.id}-${indexOfCell},这导致:
// 切换胶片时的组件生命周期变化
胶片1 → 胶片2:
- 旧组件卸载: ViewportContainer key="1-0" → unmount
- 新组件创建: ViewportContainer key="2-0" → mount
1. 组件已完全初始化 (useEffect 已执行)
2. 渲染引擎稳定运行
3. viewport 已创建并稳定
4. handleDrop → loadImage('drag')
5. 在已有的、稳定的 WebGL 上下文中操作
1. React 创建新组件实例 (key 不同)
2. useEffect 开始执行:
- 创建新的渲染引擎: `renderingEngine-${currentFilm.id}`
- 初始化 WebGL 上下文
- 创建新的 viewport
3. 同时 useEffect([imageId, stackViewport]) 也触发:
- loadImage('props') 立即执行
- 在新创建的、可能不稳定的 WebGL 上下文中操作
// Cornerstone 在新的 WebGL 上下文中会重新检查所有扩展
// 包括 OES_texture_float_linear
// 如果检查失败,会记录警告但继续执行
loadImage @ DcmCell.tsx:56 // 我们的 loadImage 函数
loadImageFromProps @ DcmCell.tsx:183 // useEffect 中的调用,不是拖拽
这确认错误来自切换胶片时的自动加载,而不是拖拽。
// 这是一个良性警告,不影响功能
// Cornerstone.js 会自动降级到兼容的渲染模式
// 如果确实需要减少日志噪音
const originalWarn = console.warn;
console.warn = (...args) => {
if (args[0] && args[0].includes('OES_texture_float_linear')) {
return; // 静默这个特定警告
}
originalWarn.apply(console, args);
};
```typescript // 确保 WebGL 上下文完全初始化后再加载图像 useEffect(() => { const loadImageFromProps = async () => {
if (!stackViewport) return;
// 给 WebGL 上下文一点初始化时间
await new Promise(resolve => setTimeout(resolve, 100));
// 然后正常加载
// ...
}; }, [imageId, stackViewport]);