带有7个后缓冲区的DirectX 11 Swap Chain

时间:2012-06-04 09:35:30

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

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

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

提前谢谢!

2 个答案:

答案 0 :(得分:7)

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

我不确定这是否真的能回答你关于使用7个缓冲区的其他应用程序的问题,但我不认为有必要,因为监视器通常只以60到75Hz的速率刷新。

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

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

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

P.S。 也许是因为应用程序在使用7缓冲区时可能会丢失一些帧速率的原因可能是因为应用程序可能无法在需要将它们呈现到屏幕之前继续写入所有缓冲区。如果使用多线程,则可能不会出现这种情况,因为在app完成绘制到所有其他后台缓冲区之前,下一个缓冲区可能会显示在屏幕上。

答案 1 :(得分:4)

好吧,我得到了微软的回答。这是为了在DC(电池)工作时节省电力 - 这样处理器就可以唤醒以处理所有可用缓冲区,将它们发送到GPU进行处理并更长时间地进入更深省电模式。