fix(render): 切片偶尔停顿根因修复 — 体绘制改全程统一全质量 + 撤销诊断埋点

- 实测(render_verify + 帧耗时埋点)定位: 体绘制走 GPU(RTX3060), 每帧~7ms(669帧全<21ms),
  渲染根本不慢; 前判"CPU回退"错误。"偶尔停顿"是帧间间隙, 非慢帧。
- 根因: ①诊断埋点每帧 flush 磁盘(偶发延迟) ②vtkSmartVolumeMapper AutoAdjust 的"停手补高清"突跳。
- 修: 撤销帧耗时埋点(及无效的 DesiredUpdateRate 改动); VoxelActor 关交互降采样(Auto/Interactive
  AdjustSampleDistances=0)→全程统一全质量(GPU 足够), 消除停手补帧的突跳。
- 全 40 测试绿; app 构建干净。
This commit is contained in:
gaozheng 2026-06-08 12:12:38 +08:00
parent 6c60f5a83d
commit a0fcc4cc62
2 changed files with 3 additions and 7 deletions

View File

@ -406,10 +406,6 @@ void buildWorkbench(QMainWindow& window, geopro::data::LocalSampleRepository& re
} }
vtkRenderWindowInteractor* interactor = renderWindowPtr->GetInteractor(); vtkRenderWindowInteractor* interactor = renderWindowPtr->GetInteractor();
if (*showSlice && interactor) { if (*showSlice && interactor) {
// 交互时目标帧率↑→体绘制自动降采样(AutoAdjustSampleDistances),拖切片不卡;
// 松手后按 StillUpdateRate 恢复全质量。
interactor->SetDesiredUpdateRate(20.0);
interactor->SetStillUpdateRate(0.001);
const std::vector<double> stops = vcs.stopValues(); const std::vector<double> stops = vcs.stopValues();
const double vmn = stops.size() >= 2 ? stops.front() : 0.0; const double vmn = stops.size() >= 2 ? stops.front() : 0.0;
const double vmx = stops.size() >= 2 ? stops.back() : 1.0; const double vmx = stops.size() >= 2 ? stops.back() : 1.0;

View File

@ -74,9 +74,9 @@ vtkSmartPointer<vtkVolume> buildVoxel(const geopro::core::ScalarVolume& vol,
// SmartVolumeMapper有 GPU 走 GPU ray cast否则自动回退 CPU避免无 GPU 时卡死/失败。 // SmartVolumeMapper有 GPU 走 GPU ray cast否则自动回退 CPU避免无 GPU 时卡死/失败。
vtkNew<vtkSmartVolumeMapper> mapper; vtkNew<vtkSmartVolumeMapper> mapper;
mapper->SetInputData(img); mapper->SetInputData(img);
// 交互时按 DesiredUpdateRate 自动降采样(与切片共渲时拖动更流畅);静止恢复全质量 // 全程统一全质量(GPU 足够快, 实测 ~7ms/帧):关掉交互降采样, 避免"停手补高清"那一帧突跳停顿
mapper->SetAutoAdjustSampleDistances(1); mapper->SetAutoAdjustSampleDistances(0);
mapper->SetInteractiveAdjustSampleDistances(1); mapper->SetInteractiveAdjustSampleDistances(0);
vtkNew<vtkVolumeProperty> prop; vtkNew<vtkVolumeProperty> prop;
prop->SetColor(color); prop->SetColor(color);