问题描述
用户反馈:在 OOOSplat 0.3.0 中预览超过约 1 GB 的 Brush Gaussian PLY 时,应用会直接闪退。发生时没有生成任务运行,系统物理内存和显存监控均未接近满载。
Windows 事件查看器记录:
- 错误应用程序:
ooo-splat.exe 0.3.0.0
- 错误模块:
KERNELBASE.dll
- 异常代码:
0xe0000008
- 错误模块版本:
10.0.19041.4957
0xe0000008 是 Chromium 在 Windows 上使用的 OOM 异常码(base::win::kOomExceptionCode)。KERNELBASE.dll 是异常被抛出的位置,不表示该 DLL 损坏。
初步判断
这是 WebView2/Chromium 内存分配失败。它不一定意味着整机 RAM 或显存已经用满,也可能是:
- WebView2/V8 渲染进程的堆限制;
- 大型连续
ArrayBuffer 分配失败;
- Windows Commit Limit / 分页文件限制;
- WebGL 单次纹理或缓冲区分配失败;
- 加载过程中的瞬时峰值未被任务管理器及时显示。
当前预览直接调用:
PlayCanvas 对未压缩 PLY 默认启用 reorderData()。该过程会:
- 为全部 Splat 计算 Morton Code;
- 使用 JavaScript
Map 和数组按空间编码分组;
- 创建完整排序索引;
- 重排所有 PLY 属性缓冲区;
- 在当前开启
gsplatCentersEnabled 的情况下额外创建中心坐标数组,并复制给排序 Worker;
- 随后创建 Unified GSplat 的 GPU 纹理和 Work Buffer。
约 1 GB 的 Brush PLY 可能包含数百万个 Splat,Morton 重排产生的 JavaScript 对象和临时分配可能远高于 PLY 文件本身。因此当前最可疑的触发点是大型未压缩 PLY 的默认 Morton 重排,但在获得崩溃 Dump 前不能断言具体失败分配。
报告设备疑似运行 Windows 10(系统组件版本为 10.0.19041),不在 OOOSplat 当前 Windows 11 支持范围内;仍应避免大型输入直接导致应用整体退出,并提供明确提示。
复现步骤
- 使用 OOOSplat 0.3.0 打开一个已完成项目。
- 项目的
final.ply 为 Brush 生成的未压缩 Gaussian PLY,大小超过约 1 GB。
- 点击“预览”。
- 文件加载过程中应用直接退出。
- 事件查看器出现
0xe0000008。
建议处理
短期
- 对大型未压缩 PLY 使用
useSplat(assetUrl, { reorder: false }),或按 Splat 数量动态关闭重排。
- 加载前解析 PLY Header,读取文件大小、
element vertex 和属性数量。
- 在进入高风险加载前显示明确提示,而不是直接尝试并闪退。
- 监听并记录 WebGL context lost、资源加载阶段和 WebView2进程失败。
- 在日志中区分:文件传输、PLY 解析、Morton 重排、中心数组、GPU资源创建和首次渲染。
长期
- 为大型模型提供压缩或分块格式,如 SOG/SPZ、LOD或Octree。
- 考虑在原生后端提前重排/转换,避免在 WebView JavaScript 堆中处理超大原始 PLY。
- 对超大模型建立基于 Splat 数量和属性数量的内存预算。
验收建议
- 超过 1 GB 的 PLY 不再导致 OOOSplat 整体闪退。
- 大型文件能够跳过 Morton 重排并进入预览,或在无法安全加载时给出可恢复的错误。
- 普通模型继续保持当前渲染效果。
- 返回任务界面后应用可继续使用。
- 日志能定位失败发生在解析、重排还是 GPU资源创建阶段。
问题描述
用户反馈:在 OOOSplat 0.3.0 中预览超过约 1 GB 的 Brush Gaussian PLY 时,应用会直接闪退。发生时没有生成任务运行,系统物理内存和显存监控均未接近满载。
Windows 事件查看器记录:
ooo-splat.exe0.3.0.0KERNELBASE.dll0xe000000810.0.19041.49570xe0000008是 Chromium 在 Windows 上使用的 OOM 异常码(base::win::kOomExceptionCode)。KERNELBASE.dll是异常被抛出的位置,不表示该 DLL 损坏。初步判断
这是 WebView2/Chromium 内存分配失败。它不一定意味着整机 RAM 或显存已经用满,也可能是:
ArrayBuffer分配失败;当前预览直接调用:
PlayCanvas 对未压缩 PLY 默认启用
reorderData()。该过程会:Map和数组按空间编码分组;gsplatCentersEnabled的情况下额外创建中心坐标数组,并复制给排序 Worker;约 1 GB 的 Brush PLY 可能包含数百万个 Splat,Morton 重排产生的 JavaScript 对象和临时分配可能远高于 PLY 文件本身。因此当前最可疑的触发点是大型未压缩 PLY 的默认 Morton 重排,但在获得崩溃 Dump 前不能断言具体失败分配。
报告设备疑似运行 Windows 10(系统组件版本为 10.0.19041),不在 OOOSplat 当前 Windows 11 支持范围内;仍应避免大型输入直接导致应用整体退出,并提供明确提示。
复现步骤
final.ply为 Brush 生成的未压缩 Gaussian PLY,大小超过约 1 GB。0xe0000008。建议处理
短期
useSplat(assetUrl, { reorder: false }),或按 Splat 数量动态关闭重排。element vertex和属性数量。长期
验收建议