geopro/.superpowers/sdd/task-12b-report.md

4.8 KiB
Raw Blame History

Task 12b 报告SetPartitions 单 mapper fps 去风险探针

状态

完成(探针真实跑出,结论:渲出但未达交互级)。

实测环境与数据

  • store9c/12 同款单线全分辨率整卷):D:\Git\lanbingtech\geopro\build\tmp\gpr_store_B_001
  • 整卷维度44476 × 29 × 162 = 208,948,248 体素417,896,496 B398.5 MBVTK_SHORT
  • 离屏渲染vtkRenderWindow SetOffScreenRenderingOn硬件加速 OpenGLoffscreen-smoke 闸门 OK

实现要点tools/gpr_poc/main.cpp 新增 renderC-partitioned 子命令)

  • WholeVolumeSource 重组整卷单个 vtkImageData不预切块
  • 关键:vtkGPUVolumeRayCastMapper 抽象基类 SetPartitions;该 API 在 OpenGL 具体实现 vtkOpenGLGPUVolumeRayCastMapper(工厂默认产物)上。故直接建该具体类, SetInputData(整卷) + SetPartitions(ceil(nx/16384),1,1)
  • 分区数:沿线 44476 → ceil(44476/16384)=3(每区 ~14826 ≤16384ny=29、nz=162 → 1。 实测 SetPartitions(3,1,1)
  • 量化域传函复用现有 makeI16VolumePropertyqmin/qmax、kBlank 透明、q.toPhys 反查 ColorScale
  • 双闸(同 9c绝不把空纹理假帧率当性能 ① CapturingOutputWindow 捕获 3D 纹理维度错误; ② 真实回读像素统计非背景像素。
  • 相机修正整卷极扁长44476:29:162首版用 ResetCamera() 全体 + 仅取末帧像素时, 末帧恰好边缘视角 → 误报“非空像素=0”。修正为以 mapper 包围盒定向 + 抬高/旋转视角让薄维度可见, 且旋转扫描中多帧采样非背景像素取最大值(区分“真渲不出”与“采样时机不巧”)。修正后稳定渲出。

核心结论SetPartitions 单 mapper 是否真渲出 + fps + 内存 + 分区数

  • 分区数SetPartitions(3, 1, 1)。
  • 是否真渲出。无纹理维度错误SetPartitions 成功绕过 GL_MAX_3D_TEXTURE_SIZE=16384 纹理墙), 真实回读非背景像素 1264非空一个 mapper 一次 ray cast。
  • 体绘制 fps~8.8 ~ 11 fps(多次实测 8.84 / 10.95 / 10.59,落在 8.811 区间)。
  • 峰值进程内存~556 ~ 653 MB整卷 398.5 MB 常驻 + 渲染开销)。

对照表

路径 是否渲出 fps
renderB 整卷单 SmartVolumeMapper INVALID纹理墙沿线 44476>16384
renderC MultiBlock每块一 mapper 渲出 9.5 静态 / 1.45 换页
renderC-partitioned 单 mapper SetPartitions 渲出 ~8.811静态整卷

是否达交互级

。目标 ≥15~30 fps实测 8.811 fps低于交互级下限。

判据落点

  • “对的架构”(单 mapper + SetPartitions确实绕过了纹理墙、确实把全分辨率整卷一次性渲出—— 这点比 9cINVALID与 12每块一 mapper都更干净证明架构方向正确。
  • 纯 GPU ray cast 静态整卷 fps 仍只有 ~911,与 renderC MultiBlock 的 9.5 静态 基本同档 未拉开差距、未到交互级。即:“每块一 mapper”不是 9.5fps 的主要元凶;瓶颈在 208M 体素全分辨率 整卷的 ray cast 本身(采样量 + 显存带宽),单 mapper 分区并不能把它变快。
  • 结论:VTK 这条路(整卷全分辨率体绘制)的交互级天花板在本数据上已暴露。要到交互级, production C 必须靠 LOD/降采样/核外换块(动态分辨率),而非寄望“单 mapper 分区”本身提速。 brief 判据的“仍不到 → 评估 OpenVDS/自建 GL”一支成立。

concerns

  1. fps 受相机框选与视图影响8.811 的波动主要来自每帧旋转中视线穿过体的采样深度差异; 该数为“静态整卷、绕轴旋转”口径,已剔除换页/解压(不像 renderC 动态 1.45 含 update。 作为“单 mapper 分区静态整卷 fps 天花板”是诚实的,但生产中真实 fps 还会被交互缩放/平移影响。
  2. 首版“空渲染”教训已修正:极扁长体 + 末帧单采样会假报空;现多帧取最大 + 视角抬高,已稳定非空。 报告口径据此可信。
  3. 本探针只验静态整卷(遵 YAGNI未做 LOD/换块/后台解压。production C 的动态分辨率方案 还需单独验证其在“降采样后”能否到交互级——这是下一根要验的链子,不在本探针范围。
  4. SetPartitions 在 9.6 属 vtkOpenGLGPUVolumeRayCastMapper(非抽象基类);若后续 VTK 升级 该 API 位置变动需留意。

交付物

  • 代码:tools/gpr_poc/main.cpp(新增 renderC-partitioned 子命令)。
  • 结果:docs/superpowers/plans/poc-results-C.md(含对照表与判据结论)。
  • 报告:本文件 .superpowers/sdd/task-12b-report.md