#4981·shadPS4

[游戏错误]:《暗黑破坏神 III》(CUSA00242) - 在锁定 60fps 的情况下,动态分辨率降至低于 1080p;GetGpuClock64 返回墙表 ns

作者: Eviljubs创建于 2026年9月8日更新于 2026年9月8日

Diablo III 使用动态分辨率 (1080p-2160p, 目标 60fps; 不是棋盘格)。在原生 v0.18.0 中,游戏保持 60fps 的锁定帧时间为 16.7ms,但其 DRS 控制器不断地降低分辨率,永远不会恢复 - 菜单上和加载级别后立即显示清晰,然后在大约 0.5-1s 内明显降低,并保持在该值。UI 保持清晰,而 3D 场景变软,这是场景渲染到一个缩小的视口内的全尺寸目标的特征。可能的原因是 src/video_core/amdgpu/pm4_cmds.h 中的 GetGpuClock64(),该函数使用 DataSelect::GpuClock64 服务 EventWriteEop / ReleaseMem 包,这是客户端标题读取 GPU 时间戳的方式。它返回原始主机墙时钟纳秒数:

static u64 GetGpuClock64() {
    auto now = std::chrono::high_resolution_clock::now();
    auto duration = now.time_since_epoch();
    auto ticks = std::chrono::duration_cast<std::chrono::nanoseconds>(duration).count();
    return static_cast<u64>(ticks);
}

有两个问题:

  1. 单位错误。真实的 GPU 时间戳以 GPU 核心时钟为单位计数。客户端计算 elapsed = (t1 - t0) / sceGnmGetGpuCoreClockFrequency() 将纳秒除以 911 MHz (Neo) 或 800 MHz,将延迟时间过高约 9.8% / 25%。

  2. 不是 GPU 执行时间,而是墙时钟时间。该值是在命令处理器处理包时采样的,因此帧之间的差异会吸收呈现 / 同步等待。一个与同步锁定的标题大约每帧测量一次完整帧周期,无论实际 GPU 加载情况如何,都会得出结论,永远超出预算,并且永远无法回调,因为墙时钟时间永远不会改善。

内容来源: shadps4-emu/shadPS4