Skip to content

预览超大 PLY 时 WebView2 OOM 闪退(0xe0000008) #21

Description

@ooolabdev

问题描述

用户反馈:在 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 单次纹理或缓冲区分配失败;
  • 加载过程中的瞬时峰值未被任务管理器及时显示。

当前预览直接调用:

useSplat(assetUrl)

PlayCanvas 对未压缩 PLY 默认启用 reorderData()。该过程会:

  1. 为全部 Splat 计算 Morton Code;
  2. 使用 JavaScript Map 和数组按空间编码分组;
  3. 创建完整排序索引;
  4. 重排所有 PLY 属性缓冲区;
  5. 在当前开启 gsplatCentersEnabled 的情况下额外创建中心坐标数组,并复制给排序 Worker;
  6. 随后创建 Unified GSplat 的 GPU 纹理和 Work Buffer。

约 1 GB 的 Brush PLY 可能包含数百万个 Splat,Morton 重排产生的 JavaScript 对象和临时分配可能远高于 PLY 文件本身。因此当前最可疑的触发点是大型未压缩 PLY 的默认 Morton 重排,但在获得崩溃 Dump 前不能断言具体失败分配。

报告设备疑似运行 Windows 10(系统组件版本为 10.0.19041),不在 OOOSplat 当前 Windows 11 支持范围内;仍应避免大型输入直接导致应用整体退出,并提供明确提示。

复现步骤

  1. 使用 OOOSplat 0.3.0 打开一个已完成项目。
  2. 项目的 final.ply 为 Brush 生成的未压缩 Gaussian PLY,大小超过约 1 GB。
  3. 点击“预览”。
  4. 文件加载过程中应用直接退出。
  5. 事件查看器出现 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资源创建阶段。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions