perf(vtk): view 开交互式采样距离自适应修长板填屏 ray-march 慢

POC 当初为离屏基准把 AutoAdjustSampleDistances/InteractiveAdjustSampleDistances
关掉(求恒定全质量),交互场景长板填屏每像素沿超长轴海量采样 → 2.8fps。开启二者
并设 interactor DesiredUpdateRate(15)/StillUpdateRate(0.5):拖动期按目标帧率拉大
SampleDistance 降采样(快、跟手),松手恢复小步长全质量。--preview 加交互态(降采样)
fps 与全质量静态对照量化提速。merged_b6 全路段实测提速 14.9x~21.2x,交互态 ≥15fps。
This commit is contained in:
gaozheng 2026-06-24 11:09:25 +08:00
parent ced2ca7811
commit a4db37735a
1 changed files with 52 additions and 10 deletions

View File

@ -3167,8 +3167,13 @@ int cmdView(int argc, char** argv) {
// gallery 同一 mapper 类型,保证交互画面 == 预览画面、fps 同档。 // gallery 同一 mapper 类型,保证交互画面 == 预览画面、fps 同档。
vtkNew<vtkSmartVolumeMapper> mapper; vtkNew<vtkSmartVolumeMapper> mapper;
mapper->SetRequestedRenderMode(vtkSmartVolumeMapper::GPURenderMode); mapper->SetRequestedRenderMode(vtkSmartVolumeMapper::GPURenderMode);
mapper->SetAutoAdjustSampleDistances(0); // C3-5交互式采样距离自适应修长板填屏 ray-march 慢的关键。POC 当初为离屏
mapper->SetInteractiveAdjustSampleDistances(0); // 基准把这两个关掉(0/0)以求恒定全质量,但交互场景必须【开启】:拖动时按渲染窗口的
// DesiredUpdateRate 拉大 SampleDistance(降采样→快)、停下恢复小步长(全质量→可慢)。
// 长板填屏慢的根因是每像素沿超长轴海量采样,LOD/异步都不缩短 ray-march 长度,只有
// 拖动期降采样才把交互态降到可跟手帧率。
mapper->SetAutoAdjustSampleDistances(1);
mapper->SetInteractiveAdjustSampleDistances(1);
auto volume = vtkSmartPointer<vtkVolume>::New(); auto volume = vtkSmartPointer<vtkVolume>::New();
volume->SetMapper(mapper); volume->SetMapper(mapper);
@ -3246,15 +3251,34 @@ int cmdView(int argc, char** argv) {
}; };
const vtkIdType defStruct = countStructPixels(); const vtkIdType defStruct = countStructPixels();
// 旋相机 N 帧测真实 fps非首帧首帧含纹理上传/shader 编译已在预热完成)。 // C3-5两态 fps 对照。AutoAdjustSampleDistances 据渲染窗口的 DesiredUpdateRate
rw->Render(); // 再预热一帧,确保管线热 // 决定 SampleDistance——高 DesiredUpdateRate=拖动态(大步长/降采样/快),低=静止态
Stopwatch sw; // (小步长/全质量/可慢)。离屏无真交互,故显式设 DesiredUpdateRate 模拟两态,旋相机
// 测真实 Render() 帧率,量化拖动降采样提速。
//
// ① 全质量静态StillUpdateRate(慢档),mapper 用最小 SampleDistance。
rw->SetDesiredUpdateRate(0.5); // 静止目标帧率(慢)→全质量
rw->Render(); // 预热一帧(管线热 + 采样距离按此档生效)
Stopwatch swStill;
for (int f = 0; f < frames; ++f) { for (int f = 0; f < frames; ++f) {
st.cam->Azimuth(360.0 / frames); st.cam->Azimuth(360.0 / frames);
rw->Render(); rw->Render();
} }
const double ms = sw.elapsedMs(); const double msStill = swStill.elapsedMs();
const double fps = ms > 0 ? frames * 1000.0 / ms : 0.0; const double fps = msStill > 0 ? frames * 1000.0 / msStill : 0.0;
// ② 交互态(降采样):高 DesiredUpdateRate(拖动目标 15fps)→ mapper 拉大 SampleDistance。
rw->SetDesiredUpdateRate(15.0); // 拖动目标帧率→降采样
rw->Render(); // 预热一帧让降采样步长生效
Stopwatch swInteract;
for (int f = 0; f < frames; ++f) {
st.cam->Azimuth(360.0 / frames);
rw->Render();
}
const double msInteract = swInteract.elapsedMs();
const double fpsInteract =
msInteract > 0 ? frames * 1000.0 / msInteract : 0.0;
rw->SetDesiredUpdateRate(0.5); // 复位
const bool texErr2 = capWin->textureError(); const bool texErr2 = capWin->textureError();
vtkOutputWindow::SetInstance(nullptr); vtkOutputWindow::SetInstance(nullptr);
@ -3268,8 +3292,18 @@ int cmdView(int argc, char** argv) {
<< " (" << (100.0 * defStruct / (winW * winH)) << " (" << (100.0 * defStruct / (winW * winH))
<< "%, 已排除深蓝灰背景)\n"; << "%, 已排除深蓝灰背景)\n";
std::cout << "纹理维度错误 : " << (texErr2 ? "是(!!)" : "") << "\n"; std::cout << "纹理维度错误 : " << (texErr2 ? "是(!!)" : "") << "\n";
std::cout << "真实渲染 fps : " << (ok ? std::to_string(fps) : "INVALID") const double speedup = fps > 0 ? fpsInteract / fps : 0.0;
<< " (" << frames << " 帧旋相机, 非首帧)\n"; std::cout << "全质量静态 fps : " << (ok ? std::to_string(fps) : "INVALID")
<< " (" << frames << " 帧旋相机, DesiredUpdateRate=0.5)\n";
std::cout << "交互态降采样 fps: "
<< (ok ? std::to_string(fpsInteract) : "INVALID") << " (" << frames
<< " 帧旋相机, DesiredUpdateRate=15)\n";
std::cout << "拖动态提速 : " << (ok ? std::to_string(speedup) : "INVALID")
<< "x (交互态/全质量)\n";
std::cout << "交互级(≥15fps) : "
<< (ok ? (fpsInteract >= 15.0 ? "是 ✔" : "否(未达拖动目标)")
: "INVALID")
<< "\n";
std::cout << "preview 结果 : " std::cout << "preview 结果 : "
<< (ok ? "OK ✔ 默认视角有结构" : "FAIL ✘") << "\n"; << (ok ? "OK ✔ 默认视角有结构" : "FAIL ✘") << "\n";
@ -3278,7 +3312,9 @@ int cmdView(int argc, char** argv) {
",opacity=" + std::to_string(opacity) + ",opacity=" + std::to_string(opacity) +
",localBricks=" + std::to_string(kViewDefaultLocalBricks) + ",localBricks=" + std::to_string(kViewDefaultLocalBricks) +
",structPixels=" + std::to_string(defStruct) + ",structPixels=" + std::to_string(defStruct) +
",fps=" + (ok ? std::to_string(fps) : "INVALID") + ",fpsStill=" + (ok ? std::to_string(fps) : "INVALID") +
",fpsInteract=" + (ok ? std::to_string(fpsInteract) : "INVALID") +
",speedup=" + (ok ? std::to_string(speedup) : "INVALID") +
",textureErr=" + std::to_string(texErr2 ? 1 : 0) + ",textureErr=" + std::to_string(texErr2 ? 1 : 0) +
",ok=" + std::to_string(ok ? 1 : 0) + ",ok=" + std::to_string(ok ? 1 : 0) +
",png=" + pngPath); ",png=" + pngPath);
@ -3327,6 +3363,12 @@ int cmdView(int argc, char** argv) {
vtkNew<vtkInteractorStyleTrackballCamera> style; vtkNew<vtkInteractorStyleTrackballCamera> style;
iren->SetInteractorStyle(style); iren->SetInteractorStyle(style);
// C3-5交互/静止目标帧率。interactor 在交互(拖动)中把渲染窗口 DesiredUpdateRate
// 拉到 DesiredUpdateRate(15)→mapper 自适应降采样(快、跟手);松手后落回 StillUpdateRate
// (0.5)→恢复小步长全质量。配合上面 mapper 的 AutoAdjust/InteractiveAdjust 才生效。
iren->SetDesiredUpdateRate(15.0);
iren->SetStillUpdateRate(0.5);
vtkNew<vtkCallbackCommand> cb; vtkNew<vtkCallbackCommand> cb;
cb->SetCallback(viewOnInteract); cb->SetCallback(viewOnInteract);
cb->SetClientData(&st); cb->SetClientData(&st);