0

我正在开发一个需要保持 60Hz 帧速率的实时渲染应用程序。我们发现每 90 秒从 SwapBuffers 返回的时间量超出 vsync 并且后续帧的开始被延迟。通过使用 GPUView 我们发现此时 System VidMm Worker Thread 正忙于处理系统上运行的每个应用程序的 Evict Paging Queue 生成的数据包。

SwapBuffer 延迟的 GPUView 在此图像中,左帧在 Vsync 之后立即开始渲染,而右帧被延迟。在这些帧之间,当线程空闲等待 SwapBuffer 返回时,System Eviction Paging 会触发大量工作由应用程序和 VidMm Worker Thread 执行。这项工作在 Vsync 之外继续进行,并将第二帧从开始延迟到驱逐工作完成。

Eviction Paging 是出乎意料的,因为 GPU 内存完全在 GPU 的能力范围内。我正在运行具有 24GB 显存的 Quadro P6000,当时该应用程序使用的内存不到 3GB,并且系统上没有任何其他 GPU 密集型运行。此外,无论我的应用程序是否正在运行,此行为每 90 秒在我的计算机上发生一次。在运行《孤岛危机 2》作为测试时,我也看到了相同的行为。

当系统没有过度使用 GPU 内存时,什么会触发 GPU Memory Evict Paging?有没有办法阻止这种情况发生?可以将应用程序配置为在系统要求时不驱逐视频内存吗?如果上述方法是不可能的,有没有办法安排驱逐逻辑以防止它在 Vsync 之前发生?或者有没有办法防止 SwapBuffers 被这项工作延迟,以便下一帧的 CPU 工作可以准时开始?

4

0 回答 0