From b2d130a7bfc9d188a99b3628585b47a4493c64c7 Mon Sep 17 00:00:00 2001 From: gaozheng Date: Mon, 29 Jun 2026 16:44:42 +0800 Subject: [PATCH] =?UTF-8?q?fix(radar/perf):=20=E5=A4=A7=E4=BD=93=E5=BC=80?= =?UTF-8?q?=E5=90=AF=E4=BA=A4=E4=BA=92=E6=9C=9F=E9=87=87=E6=A0=B7=E8=B7=9D?= =?UTF-8?q?=E8=87=AA=E9=80=82=E5=BA=94,=E6=97=8B=E8=BD=AC=E6=B5=81?= =?UTF-8?q?=E7=95=85=E5=81=9C=E6=89=8B=E5=85=A8=E8=B4=A8=E9=87=8F(?= =?UTF-8?q?=E4=B8=8D=E9=99=8D=E6=95=B0=E6=8D=AE)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因:VoxelActor 体绘制 SetAutoAdjustSampleDistances(0)(全程全质量) + SampleDistance=0.3×minSp。雷达体 dz≈9.4mm(516采样/~4.8m)→ 单条光线 ~1700 采样步,每帧数十亿采样,旋转每帧都全质量 → 卡。原设定是为小反演体(~7ms/帧)调的。 修复:体素>4M 的大体开启 AutoAdjust/InteractiveAdjust——旋转时 VTK 自动加大 采样步保流畅,停手即恢复 0.3×minSp 出全质量帧。只降【渲染期】采样、不动数据; 切片/异常取自全分辨率体,保真不受影响。小体保持全程全质量避免突跳。 --- src/render/actors/VoxelActor.cpp | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/render/actors/VoxelActor.cpp b/src/render/actors/VoxelActor.cpp index aeb43d2..60842ff 100644 --- a/src/render/actors/VoxelActor.cpp +++ b/src/render/actors/VoxelActor.cpp @@ -77,6 +77,13 @@ vtkSmartPointer assembleVolume(vtkImageData* img, (bnd[3] - bnd[2]) * (bnd[3] - bnd[2]) + (bnd[5] - bnd[4]) * (bnd[5] - bnd[4])); // 包围盒对角(最长穿越路径) + // 大体(如雷达:24M 体素、深度采样距 mm 级 → 单条光线上千采样步)开启【交互期】采样距自适应: + // 旋转时 VTK 自动加大采样步(变粗)保流畅,停手即恢复设定的细采样距(0.3×minSp)出全质量帧。 + // 只是渲染期降采样、【绝不动数据】;切片/异常取自全分辨率体,保真不受影响。 + // 小体(反演,实测~7ms/帧)保持全程全质量,避免"停手补高清"的视觉突跳。 + constexpr vtkIdType kInteractiveLodVoxels = 4'000'000; + const int interactiveAdjust = (img->GetNumberOfPoints() > kInteractiveLodVoxels) ? 1 : 0; + vtkSmartPointer mapper; if (mask && g_gpuVolumeSupported) { // 真白化:mask=0 体素被光线投射完全跳过,杜绝空值格沿边界渗蓝。需 GPU 光线投射支持。 @@ -84,8 +91,8 @@ vtkSmartPointer assembleVolume(vtkImageData* img, gpu->SetInputData(img); gpu->SetMaskInput(mask); gpu->SetMaskTypeToBinary(); - gpu->SetAutoAdjustSampleDistances(0); // 全程全质量(GPU 直接 mapper 无交互降采样开关) - // 关了自适应必须显式给【细】采样距离,否则用粗默认值 → 看到一层层体素(分层伪影)。 + gpu->SetAutoAdjustSampleDistances(interactiveAdjust); // 大体:交互降采样保流畅,停手全质量;小体:全程全质量 + // 静止帧用【细】采样距离(0.3×minSp):否则用粗默认值 → 看到一层层体素(分层伪影)。 if (minSp > 0) gpu->SetSampleDistance(static_cast(0.3 * minSp)); // 抖动:用噪声纹理微扰每条光线的采样起点,消除规则采样面造成的「木纹/分层」伪影(VTK 官方此用途)。 gpu->SetUseJittering(1); @@ -94,9 +101,9 @@ vtkSmartPointer assembleVolume(vtkImageData* img, // SmartVolumeMapper:有 GPU 走 GPU ray cast,否则自动回退 CPU,避免无 GPU 时卡死/失败。 vtkNew sm; sm->SetInputData(img); - // 全程统一全质量(GPU 足够快, 实测 ~7ms/帧):关掉交互降采样, 避免"停手补高清"那一帧突跳停顿。 - sm->SetAutoAdjustSampleDistances(0); - sm->SetInteractiveAdjustSampleDistances(0); + // 大体交互降采样保流畅(停手恢复全质量);小体全程全质量(GPU 足够快, 实测 ~7ms/帧)避免突跳。 + sm->SetAutoAdjustSampleDistances(interactiveAdjust); + sm->SetInteractiveAdjustSampleDistances(interactiveAdjust); mapper = sm; }