新闻详情

新闻详情

首页 / 资讯中心 / 详情

PyTorch 复现 DehazeNet:从环境搭建到推理部署的完整指南

发布时间:2026/10/2 3:04:50来源:尧图网络
PyTorch 复现 DehazeNet:从环境搭建到推理部署的完整指南
简介这份资源是面向具备深度学习基础的研究者与图像处理方向学习者的PyTorch版DehazeNet图像去雾实现核心解决从零复现去雾网络、缺少可复现训练流程与预训练权重的问题。压缩包共21个文件约114KB以9个py训练与推理脚本、4个m脚本、2个pth预训练权重为主另含zbak备份、txt说明与readme文档覆盖室内与室外两套训练流程及引导滤波等后处理环节。资源提供经过完整训练得到的best_indoor.pth与best_outdoor.pth模型文件可直接加载推理也可基于现有网络结构开展扩展实验配套的说明文档与readme便于理解各模块职责与调用方式。目前已有86人学习适合希望快速上手去雾算法、对照代码理解网络细节并在此基础上做改进实验的读者参考。资源来源于网络分享仅用于学习交流请勿用于商业用途。1. 从一张灰蒙蒙的照片说起DehazeNet 到底解决了什么拍过户外照片的人大概都有这种体验明明肉眼看着通透的山谷相机拍出来却像蒙了一层灰纱远处山脊的层次全糊在一起。这不是镜头脏了而是大气散射在作怪——空气中的悬浮颗粒把光线散射到各个方向导致传感器接收到的图像对比度下降、色彩发白。传统做法靠暗通道先验Dark Channel Prior估算透射率再反解无雾图像参数多、对天空区域容易翻车。DehazeNet 的思路完全不同它用卷积网络直接学习「有雾图像 → 透射率图」的映射把去雾这件事从手工调参变成端到端回归。这篇要讲的就是基于 PyTorch 把 DehazeNet 从论文复现到能跑通推理的完整路径包括环境搭建、网络结构拆解、预训练模型加载、单张图和批量去雾的代码以及我在实际调试中踩过的坑。适合两类人一是刚接触 PyTorch、想找一个完整项目练手的同学二是手里有去雾需求、想快速验证 DehazeNet 效果的工程师。读完你应该能自己搭出一套可用的去雾流程并且知道哪些参数不能乱动。2. DehazeNet 的网络结构与 PyTorch 环境搭建2.1 为什么 DehazeNet 用四层卷积而不是直接上 ResNetDehazeNet 发表于 2016 年那个年代把深度学习用于底层视觉任务还算新鲜。它的设计哲学很朴素透射率图本质上是一张和输入同分辨率的单通道灰度图不需要 ImageNet 分类那种上百层的容量。整个网络只有四层可学习结构每一层都有明确的物理含义对应。第一层是特征提取用 16 个 5×5 卷积核输出 16 通道特征图。第二层叫多尺度映射并行用 3×3、5×5、7×7 三种卷积核各做一次卷积再拼接目的是捕捉不同尺度的雾浓度变化。第三层是局部极值用 7×7 的最大池化模拟暗通道先验里的局部最小值操作。第四层是激活层用 BReLU双边修正线性单元把输出限制在 [0,1] 区间因为透射率的物理意义决定了它不能为负也不能超过 1。这里有个容易忽略的点BReLU 不是普通的 ReLU。普通 ReLU 只截断负值上界是无穷大BReLU 同时截断上下界公式是 min(max(x, 0), 1)。如果你直接用 nn.ReLU() 替换训练时透射率会溢出推理出来的图会大面积过曝。我在第一次复现时就犯过这个错生成的图天空区域全白排查了半天才发现是激活函数的问题。那为什么不直接用 ResNet 预训练模型做骨干理论上可以但 DehazeNet 的参数量只有几万推理速度极快在嵌入式设备上也能跑。用 ResNet50 做骨干参数量直接飙到两千多万对于透射率估计这种低层任务来说属于杀鸡用牛刀而且预训练权重来自 ImageNet 分类任务和去雾的域差异太大微调成本反而更高。所以如果你的场景是实时去雾或者边缘部署DehazeNet 这种轻量结构更合适如果追求极致效果且算力充足可以考虑后来基于 ResNet 或 Transformer 的去雾方案。2.2 PyTorch 环境搭建从 CUDA 版本到 conda 虚拟环境环境搭建是新手最容易卡住的地方。PyTorch 安装本身不复杂但 CUDA 版本、显卡驱动、Python 版本三者之间的对应关系经常让人头疼。我一般用 conda 建独立虚拟环境避免和系统 Python 打架。先确认显卡驱动支持的 CUDA 版本nvidia-smi输出右上角会显示「CUDA Version: 12.x」之类的信息这代表驱动最高支持的 CUDA 版本不是你实际安装的版本。然后去 PyTorch 官网查对应的安装命令。以 CUDA 11.8 为例conda create -n dehazenet python3.10 -y conda activate dehazenet pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118如果你用的是 AMD 显卡比如 7900XTX在 WSL 下跑 PyTorch 需要装 ROCm 版本命令换成--index-url https://download.pytorch.org/whl/rocm5.7。注意 ROCm 对 Windows 原生支持有限WSL 是更稳妥的选择。国产平台比如麒麟 V10 加海光 GPU通常需要厂商提供适配的 PyTorch 轮子直接 pip 装官方版大概率跑不起来这个要有心理准备。装完后验证import torch print(torch.__version__) print(torch.cuda.is_available()) print(torch.cuda.get_device_name(0) if torch.cuda.is_available() else CPU only)如果cuda.is_available()返回 False先检查驱动版本是否匹配再确认安装的 PyTorch 是不是 CPU 版本。常见错误是 pip 源里混了 CPU 版卸载重装指定 index-url 即可。提示Python 和 PyTorch 版本有对应关系3.10 目前兼容性最好。3.12 在某些旧版 PyTorch 上会有 wheel 缺失问题新手建议直接用 3.10。2.3 用 nn.Module 搭出 DehazeNet 的完整代码下面是我实际用的网络定义结构上忠实于原论文同时做了一点工程化调整——把 BReLU 单独封装成模块方便复用和替换。import torch import torch.nn as nn import torch.nn.functional as F class BReLU(nn.Module): 双边修正线性单元将输出限制在 [0, 1] def forward(self, x): return torch.clamp(x, 0.0, 1.0) class DehazeNet(nn.Module): def __init__(self): super(DehazeNet, self).__init__() # 第一层特征提取5x5 卷积16 通道 self.conv1 nn.Conv2d(3, 16, kernel_size5, padding2) # 第二层多尺度映射三路并行卷积 self.conv2_1 nn.Conv2d(16, 16, kernel_size3, padding1) self.conv2_2 nn.Conv2d(16, 16, kernel_size5, padding2) self.conv2_3 nn.Conv2d(16, 16, kernel_size7, padding3) # 第三层局部极值7x7 最大池化 self.pool nn.MaxPool2d(kernel_size7, stride1, padding3) # 第四层透射率回归输出单通道 self.conv3 nn.Conv2d(48, 1, kernel_size1) self.brelu BReLU() def forward(self, x): x F.relu(self.conv1(x)) # 三路多尺度卷积后拼接 x1 self.conv2_1(x) x2 self.conv2_2(x) x3 self.conv2_3(x) x torch.cat([x1, x2, x3], dim1) # 16*3 48 通道 x self.pool(x) x self.conv3(x) x self.brelu(x) return x逐段说明conv1的 padding2 保证输出尺寸和输入一致因为 5×5 卷积核需要 2 像素填充。第二层三路卷积的 padding 分别是 1、2、3对应 3×3、5×5、7×7 核这样三路输出尺寸相同才能拼接。pool的 stride1 和 padding3 也是同样目的保持空间分辨率不变。最后conv3用 1×1 卷积把 48 通道压成单通道透射率图。参数上唯一需要根据场景调整的是conv1的输出通道数。原论文用 16如果你训练数据量大、雾的形态复杂可以加到 32 或 64但推理速度会线性下降。我一般先用 16 跑通效果不够再加。3. 预训练模型加载与推理从权重文件到去雾图像3.1 预训练权重怎么加载才不出错拿到预训练模型后第一件事是确认权重文件的格式。常见的有两种一种是纯 state_dictPyTorch 保存的 OrderedDict另一种是包含模型结构定义的完整 checkpoint。DehazeNet 的预训练权重通常是前者。import torch from model import DehazeNet # 假设网络定义在 model.py device torch.device(cuda if torch.cuda.is_available() else cpu) net DehazeNet().to(device) # 加载预训练权重 state_dict torch.load(dehazenet_pretrained.pth, map_locationdevice) net.load_state_dict(state_dict) net.eval() # 切换到推理模式关闭 dropout 和 batchnorm 更新 print(模型加载成功参数量, sum(p.numel() for p in net.parameters()))这里有几个关键点。map_locationdevice保证在 CPU 上也能加载 GPU 保存的权重避免「CUDA out of memory」或「no CUDA device」报错。net.eval()必须调用虽然 DehazeNet 没有 dropout 和 batchnorm但养成习惯没坏处。如果加载时报 key 不匹配大概率是权重文件里的层名和你定义的层名不一致可以用print(state_dict.keys())对比排查。注意不要用torch.load加载来源不明的权重文件pickle 反序列化存在安全风险。优先使用官方或可信来源的模型。3.2 单张图像去雾的完整推理流程DehazeNet 输出的是透射率图 t(x)还需要结合大气光值 A 才能还原无雾图像。大气散射模型是 I(x) J(x)·t(x) A·(1-t(x))反解得到 J(x) (I(x) - A) / t(x) A。大气光 A 通常取暗通道中最亮的前 0.1% 像素的均值。import cv2 import numpy as np import torch def estimate_atmospheric_light(img, dark_channel, top_percent0.001): 从暗通道中估计大气光值 A h, w dark_channel.shape num_pixels max(int(h * w * top_percent), 1) # 取暗通道最亮的前 num_pixels 个像素 flat dark_channel.ravel() indices flat.argsort()[-num_pixels:] # 在原图中找对应位置最亮的像素作为 A img_flat img.reshape(-1, 3) a img_flat[indices].mean(axis0) return a def dehaze_single(net, img_path, device): # 读取图像并归一化到 [0, 1] img cv2.imread(img_path) img cv2.cvtColor(img, cv2.COLOR_BGR2RGB).astype(np.float32) / 255.0 input_tensor torch.from_numpy(img).permute(2, 0, 1).unsqueeze(0).to(device) with torch.no_grad(): t net(input_tensor) # 透射率图 [1, 1, H, W] t t.squeeze().cpu().numpy() t np.clip(t, 0.1, 1.0) # 防止除零下限设 0.1 # 估计大气光 dark np.min(img, axis2) A estimate_atmospheric_light(img, dark) # 反解无雾图像 J (img - A) / t[:, :, np.newaxis] A J np.clip(J, 0, 1) J (J * 255).astype(np.uint8) return cv2.cvtColor(J, cv2.COLOR_RGB2BGR) # 使用 result dehaze_single(net, hazy.jpg, device) cv2.imwrite(dehazed.jpg, result)逻辑说明输入图像归一化后转成 tensor增加 batch 维度送入网络。透射率图裁剪到 [0.1, 1.0] 是防止 t 接近 0 时除法爆炸这个下限值可以根据实际效果微调设太小会引入噪声设太大会导致去雾不彻底。大气光估计用暗通道最亮像素是经典做法对大多数自然图像有效但如果图像里有大面积白色物体比如雪地、白墙A 会被高估去雾后整体偏暗。这种情况可以改用图像最亮区域或者手动指定 A。3.3 批量处理与推理速度优化实际项目中往往要处理整个文件夹的图像逐张调用上面的函数效率不高。可以把多张图拼成一个 batch 送进网络GPU 利用率会高很多。def dehaze_batch(net, img_dir, output_dir, device, batch_size8): import os os.makedirs(output_dir, exist_okTrue) img_files [f for f in os.listdir(img_dir) if f.endswith((.jpg, .png))] for i in range(0, len(img_files), batch_size): batch_files img_files[i:ibatch_size] batch_imgs [] for f in batch_files: img cv2.imread(os.path.join(img_dir, f)) img cv2.cvtColor(img, cv2.COLOR_BGR2RGB).astype(np.float32) / 255.0 batch_imgs.append(img) # 统一尺寸取 batch 内最小尺寸裁剪 min_h min(im.shape[0] for im in batch_imgs) min_w min(im.shape[1] for im in batch_imgs) batch_imgs [im[:min_h, :min_w] for im in batch_imgs] tensor torch.from_numpy(np.stack(batch_imgs)).permute(0, 3, 1, 2).to(device) with torch.no_grad(): t_batch net(tensor).cpu().numpy() for j, f in enumerate(batch_files): t np.clip(t_batch[j, 0], 0.1, 1.0) img batch_imgs[j] dark np.min(img, axis2) A estimate_atmospheric_light(img, dark) J (img - A) / t[:, :, np.newaxis] A J np.clip(J, 0, 1) J (J * 255).astype(np.uint8) cv2.imwrite(os.path.join(output_dir, f), cv2.cvtColor(J, cv2.COLOR_RGB2BGR))批量处理的核心约束是尺寸必须一致这里用裁剪到最小尺寸的方式简单处理。如果你的图像尺寸差异很大建议先 resize 到统一尺寸再送网络推理完再 resize 回原尺寸。batch_size 根据显存调整8 张 512×512 的图大约占 2GB 显存24G 显存的卡可以开到 32 甚至更大。速度方面DehazeNet 本身很轻瓶颈通常在数据预处理和后处理。如果追求极致速度可以把模型转成 ONNX 再用 TensorRT 推理或者用 torch.jit.trace 做图优化。不过对于大多数离线处理场景PyTorch 原生推理已经够用了。4. 训练自己的去雾模型数据集、损失函数与调参4.1 去雾数据集的选择与合成DehazeNet 是监督学习需要成对的「有雾图-无雾图」训练数据。公开数据集里 RESIDE 最常用包含室内和室外场景但完整版有几十 GB下载和预处理都比较耗时。如果只是想快速验证可以用 NYU2 深度数据集自己合成雾图。合成公式就是大气散射模型的逆过程给定无雾图 J 和深度图 d透射率 t exp(-β·d)β 是散射系数然后 I J·t A·(1-t)。β 一般取 0.5 到 1.5 之间的随机值A 取 0.8 到 1.0 之间的随机值这样能生成不同浓度的雾。def synthesize_haze(clean_img, depth_map, beta1.0, A0.9): 根据深度图合成有雾图像 t np.exp(-beta * depth_map) t np.clip(t, 0.1, 1.0) haze clean_img * t[:, :, np.newaxis] A * (1 - t[:, :, np.newaxis]) return np.clip(haze, 0, 1), t这个合成方法的优点是你可以控制雾的浓度和大气光生成大量配对数据。缺点是合成雾和真实雾在物理特性上有差异模型在真实雾图上可能表现下降。如果目标场景是真实拍摄的雾图建议在合成数据训练后再用少量真实配对数据微调。4.2 损失函数MSE 够用但 SSIM 更贴近人眼最直接的损失是透射率图的均方误差criterion nn.MSELoss()但 MSE 优化的是像素级差异生成的透射率图可能在数值上接近真值去雾后的图像视觉质量却一般。实践中我会把 MSE 和 SSIM结构相似性结合起来from pytorch_msssim import ssim def combined_loss(pred_t, true_t, pred_img, true_img, alpha0.7): mse_loss F.mse_loss(pred_t, true_t) ssim_loss 1 - ssim(pred_img, true_img, data_range1.0, size_averageTrue) return alpha * mse_loss (1 - alpha) * ssim_lossalpha 控制两者的权重我一般设 0.7 偏向 MSE因为透射率估计的准确性是基础。如果发现去雾后图像细节丢失严重可以把 alpha 降到 0.5 让 SSIM 发挥更大作用。注意 SSIM 计算需要 pred_img 和 true_img 都是去雾后的图像这意味着训练时前向传播要跑两次——一次出透射率一次用透射率反解图像。计算量会增加但效果提升明显。4.3 学习率、batch size 和训练轮数的实操设置DehazeNet 参数量小训练相对容易收敛。我常用的配置是参数推荐值说明学习率1e-3Adam 优化器后期可降到 1e-4batch size16显存不够降到 8影响不大训练轮数100合成数据 50 轮左右就收敛了权重衰减1e-4防止过拟合学习率调度StepLR每 30 轮降为原来的 0.5训练循环的骨架optimizer torch.optim.Adam(net.parameters(), lr1e-3, weight_decay1e-4) scheduler torch.optim.lr_scheduler.StepLR(optimizer, step_size30, gamma0.5) for epoch in range(100): net.train() total_loss 0 for hazy, clean, t_true in train_loader: hazy, clean, t_true hazy.to(device), clean.to(device), t_true.to(device) t_pred net(hazy) loss F.mse_loss(t_pred, t_true) optimizer.zero_grad() loss.backward() optimizer.step() total_loss loss.item() scheduler.step() print(fEpoch {epoch1}, Loss: {total_loss/len(train_loader):.6f})如果 loss 震荡厉害先把学习率降到 1e-4 试试。如果 loss 下降很慢检查数据归一化是否正确——输入必须在 [0,1] 之间透射率真值也必须在 [0,1] 之间。我见过有人把图像归一化到 [-1,1] 然后透射率用 [0,1]网络直接学崩。5. 避坑与排查DehazeNet 落地时最容易翻车的五个地方5.1 去雾后图像整体偏暗或偏亮现象推理出来的图要么像蒙了一层灰要么暗部死黑一片。原因大气光 A 估计不准。如果 A 被高估反解公式里 (I-A) 的负值部分被 clip 掉暗部细节丢失如果 A 被低估去雾不彻底。解决先可视化暗通道和估计出的 A 值。正常情况下 A 应该在 0.7 到 1.0 之间。如果 A 接近 1.0 但图像明显没有白色物体说明暗通道估计有问题可以改用图像最亮 0.1% 像素的均值作为 A或者手动指定 A0.95 试试。5.2 透射率图出现棋盘格伪影现象输出的透射率图上有规律的网格状纹理去雾后图像也有对应伪影。原因卷积核尺寸和 padding 不匹配导致的空间混叠。最常见的是第二层多尺度卷积的 padding 设错三路输出尺寸差了一两个像素拼接时对不齐。解决在 forward 里打印每一层输出的 shape确认三路卷积输出尺寸完全一致。如果差 1 像素调整 padding 值。另外检查输入图像尺寸是否能被 2 整除奇数尺寸在某些池化配置下也会出问题。5.3 GPU 显存溢出CUDA out of memory现象训练或推理时突然报显存不足batch size 明明设得很小。原因PyTorch 默认会缓存显存多次推理后缓存不释放。或者图像分辨率太高单张 4K 图的中间特征图就能吃掉几个 GB。解决推理时用with torch.no_grad():包住前向传播减少中间变量。如果还不行在每次推理后调用torch.cuda.empty_cache()。训练时把图像裁剪成 256×256 的 patch不要整图送进去。另外检查是不是忘了net.eval()训练模式下 batchnorm 会累积统计量显存占用更高。5.4 预训练权重加载后效果很差现象权重文件加载成功没有报错但推理结果和随机初始化差不多。原因权重文件的 key 和模型定义的 key 不匹配load_state_dict默认 strictTrue 会报错但如果用了 strictFalse 就会静默跳过不匹配的层导致部分层还是随机权重。解决加载时加strictTrue默认值让它报错。然后对比state_dict.keys()和net.state_dict().keys()找出差异。常见差异是保存权重时用了nn.DataParallelkey 前面多了module.前缀手动去掉即可state_dict {k.replace(module., ): v for k, v in state_dict.items()} net.load_state_dict(state_dict)5.5 CPU 推理速度慢到无法接受现象在服务器 CPU 上跑一张 512×512 的图要好几秒。原因PyTorch 默认用单线程做卷积没有利用多核 CPU。解决设置torch.set_num_threads(8)或设为物理核心数。另外把模型转成 ONNX 再用 onnxruntime 推理CPU 上通常有 2-3 倍加速。如果还是慢考虑用 OpenVINO 做推理优化Intel CPU 上效果显著。6. 进阶技巧用 TorchScript 导出与 ONNX 部署训练完模型后直接拿 Python 脚本推理在生产环境往往不够。要么依赖太重要么速度不达标。我一般会把模型导出成 TorchScript 或 ONNX前者适合 C 部署后者适合跨框架推理。TorchScript 导出很简单net.eval() example_input torch.randn(1, 3, 256, 256).to(device) traced torch.jit.trace(net, example_input) traced.save(dehazenet_traced.pt) # 加载时不需要原始模型定义 loaded torch.jit.load(dehazenet_traced.pt) output loaded(example_input)torch.jit.trace会记录一次前向传播的计算图所以 example_input 的尺寸决定了导出模型的固定输入尺寸。如果你的输入尺寸不固定用torch.jit.script代替但需要网络里没有动态控制流。DehazeNet 结构简单trace 完全够用。ONNX 导出torch.onnx.export( net, example_input, dehazenet.onnx, input_names[input], output_names[transmission], dynamic_axes{input: {0: batch, 2: height, 3: width}}, opset_version11 )dynamic_axes让导出的模型支持动态 batch 和动态尺寸部署时更灵活。opset_version 用 11 兼容性最好太高了某些推理引擎不支持。导出后一定要验证数值一致性import onnxruntime as ort sess ort.InferenceSession(dehazenet.onnx) onnx_out sess.run(None, {input: example_input.cpu().numpy()})[0] torch_out net(example_input).cpu().detach().numpy() print(最大误差, np.abs(onnx_out - torch_out).max())误差在 1e-5 以内算正常超过 1e-3 说明导出过程有问题检查是否有不支持的操作被替换了。最后说一个我自己的习惯每次导出模型后都会拿同一张测试图分别用 PyTorch、TorchScript、ONNX 跑一遍肉眼对比去雾结果。数值一致不代表视觉一致有时候 ONNX 的算子实现有细微差异放大到图像上就是可见的色偏。这个验证步骤花不了几分钟但能省掉上线后排查的麻烦。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

昇腾平台RAG索引结构优化:从向量索引到混合检索 2026/10/2 4:58:54

昇腾平台RAG索引结构优化:从向量索引到混合检索

1. 先把“检索前优化”这四个字掰开揉碎做RAG落地的人,迟早都会撞上这么一个问题:文档库越来越大,检索结果却越来越不像话。你以为是embedding模型不够强,咬咬牙换了一个更大的,结果该错还是错。我在昇腾平台上跑RAG S…

阅读更多 →
RRSI揭示模型如何自己改评测系统:奖励黑客与Harness防御 2026/10/2 4:58:48

RRSI揭示模型如何自己改评测系统:奖励黑客与Harness防御

“模型自己改自己”这种事,这两年见得不算少。微调、RLHF、蒸馏、合成数据,本质上都是让模型在训练信号里“变得更好”。但 Google 这份 RRSI 研究稿让我愣了一下,在于它把改造对象换成了评测系统本身。论文里所谓 Harness,不是我…

阅读更多 →
游戏同步机制实战:帧同步与状态同步混合架构设计 2026/10/2 4:58:48

游戏同步机制实战:帧同步与状态同步混合架构设计

1. 这不是理论课,是我在《永劫无间》服务器组蹲了三个月后画的“血泪流程图”你点开《永劫无间》匹配进一局,刀光剑影、钩锁横飞,0.1秒的延迟都让你怀疑网络出了问题——但真正决定你能不能“反杀成功”的,从来不是你家宽带的Mbps…

阅读更多 →
openrig开源模拟驾驶舱:从铝型材选配到直驱调校全指南 2026/10/2 4:58:47

openrig开源模拟驾驶舱:从铝型材选配到直驱调校全指南

在模拟赛车圈混了几年,openrig 这个名字对我来说早就不是陌生词汇了。它是一个完全开源的模拟驾驶舱方案:把整个支架的铝型材尺寸、零件采购清单、装配逻辑全部公开,谁都可以照着做一套出来。很多新手看到成品模拟驾驶舱几千上万的价格时都会…

阅读更多 →
AI资讯日报:大模型训练与智能体工程化实战指南 2026/10/2 4:58:47

AI资讯日报:大模型训练与智能体工程化实战指南

今天AI圈的消息面其实比看上去更有意思。我翻了一遍2026-09-21前后的热搜词,发现大量零散关键词背后都指向同一批主线:大模型训练方法、智能体工程化、AI编程与测试、AI视频与短剧,以及各种垂直场景的落地。这篇AI资讯日报不是简单复述热搜标…

阅读更多 →
GPU高负载下WaitForPresent失真原因与定位方法 2026/10/2 4:58:47

GPU高负载下WaitForPresent失真原因与定位方法

1. 这个问题到底在说啥:GPU高负载下WaitForPresent异常沉默的真相你有没有遇到过这样的场景:UWA GOT Online 报告里GPU时间曲线一路飙红,峰值接近95%,帧率却稳如老狗,掉帧不明显,更诡异的是——WaitForPres…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉