【问题标题】:DirectX 11 Swap Chain with 7 back buffers具有 7 个后台缓冲区的 DirectX 11 交换链
【发布时间】:2012-06-08 09:37:21
【问题描述】:

我有一个在 Windows 8 上以桌面模式运行的专有媒体播放器。运行时 DirectX 版本为 11,但本机图形驱动程序支持 DirectX 9。
在一些具有完全相同设置的计算机上,我看到实际交换链的后台缓冲区计数为 2,性能非常好,而在其他一些计算机上,后台缓冲区计数为 7,并且有帧丢失。
我没有该播放器的源代码,想知道在运行时确定不同的后台缓冲区计数的原因可能是什么。
有人可以解释为什么这样的后缓冲计数会导致性能发生这种变化吗?或者只是将我指向解释后备缓冲区数量含义的相关文档?

(更多调试信息:使用 GPUView 我看到当后备缓冲区计数为 2 时,硬件在同步模式下工作,即每秒 VSync 中硬件队列中的一个数据包(剪辑帧速率为 30fps),当用于 7 个后备缓冲区时这项工作一起完成了 5-7 帧,然后是一些空的 VSync,然后是 5-7 帧,依此类推)。

提前谢谢你!

【问题讨论】:

    标签: performance windows-8 directx directx-11 dxva


    【解决方案1】:

    我没有真正看到超过 4 个缓冲区的用途(四缓冲区,用于stereoscopy)。大多数应用程序使用 2 个缓冲区(双缓冲),以便应用程序可以在第一个(前)缓冲区呈现给监视器时开始将下一帧绘制到第二个(后)缓冲区,否则,应用程序将不得不等到前端缓冲区在开始绘制下一帧之前完成了对屏幕的绘制。三重缓冲只是扩展了这个想法,因此有两个后台缓冲区。这样,如果应用程序能够以比前端缓冲区呈现到屏幕的速度更快的速度完成整个缓冲区的绘制,那么它可以开始将下一帧绘制到第三个缓冲区,而不是等待前端缓冲区完成呈现。

    我不确定这是否真的回答了您关于使用 7 个缓冲区的其他应用程序的问题,但我再次认为没有必要,因为显示器通常仅以 60 到 75Hz 的速率刷新。

    如果您的应用程序运行速度如此之快,以至于它能够在第一个缓冲区完成呈现之前绘制 2 个缓冲区,那么只需让应用程序休眠直到前端缓冲区完成,以便让其他程序有机会使用 cpu,或者花额外的时间为你的应用做一些其他的处理。如果它是一个媒体播放器,您可以花费额外的时间做一些更昂贵的操作来提高媒体播放的质量。

    虽然这里有一个描述缓冲的链接,但他们不会谈论超过 4 个缓冲区,可能是因为没有必要。

    http://en.wikipedia.org/wiki/Multiple_buffering

    附: 应用程序在使用 7 个缓冲区时可能会丢失一些帧速率的原因可能是因为应用程序可能无法在所有缓冲区需要呈现到屏幕之前继续写入它们。如果使用了多线程,情况可能就不是这样了,因为这样下一个缓冲区可能会在应用程序完成对所有其他后台缓冲区的绘制之前呈现到屏幕上。

    【讨论】:

      【解决方案2】:

      嗯,我得到了微软的答复。这是为了在使用 DC(电池)时节省电量 - 这样处理器可以唤醒以处理所有可用的缓冲区,将它们发送到 GPU 以继续工作并在更长时间内进入更深的省电模式。

      【讨论】:

      • 是的,减少唤醒周期数可以提高许多系统笔记本电脑和移动系统的电池性能。它还可以减少热量的产生。此外,在桌面系统上,缓冲一定数量的渲染帧可以防止处理器或 GPU 在短时间内被占用时出现丢帧。这是以稍微增加延迟为代价的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多