5

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

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

先感谢您!

4

2 回答 2

7

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

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

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

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

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

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

于 2012-06-07T10:15:30.427 回答
5

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

于 2012-11-19T10:05:06.787 回答