24

与窗口模式相比,Direct3D 应用程序在全屏模式下的性能似乎要好得多。这背后的技术原因是什么?

我想这与全屏应用程序可以获得对显示的独占控制这一事实有关。但为什么应用程序无法获得对部分屏幕(即窗口)的独占控制权,并具有相同的性能优势呢?

4

4 回答 4

23

以下是关于事情如何在下面工作的悬崖笔记。

监视器屏幕总是需要与所谓的主表面相关联才能显示任何内容,即显卡只能从显存中的一个表面扫描出来。

当应用程序全屏时(并且一切都设置正确以启用翻转),主表面只是应用程序后台缓冲区之一,并且每帧都翻转到另一个后台缓冲区。这是在屏幕上呈现的最有效方式,但它要求应用程序拥有整个监视器区域(即整个主表面)。

当没有全屏应用程序并且 DWM 关闭时,主表面归操作系统所有,每个窗口应用程序都会执行从应用程序后台缓冲区到主表面的 blit。此 blit 需要一些 GPU 时间才能完成(以及来自屏幕上可见的其他应用程序的 blit),因此它不如全屏演示高效。XP就是这样工作的。

当 DWM 组成屏幕时,事情变得更加复杂。在这里,DWM 拥有主表面,需要在那里绘制应用程序窗口。为了使它成为可能,每个窗口都有一个关联的表面来保存其内容,称为重定向表面(它允许 DWM 启用窗口重影、玻璃效果和所有这些好东西)。每次 D3D 应用程序发出一个帧时,它都会向重定向表面添加一个 blit。这样,需要发生几个 blit:应用程序 blit 到重定向表面,DWM 从重定向表面到主表面 blit,与全屏相比,这又是一些开销。

请注意,所有这些额外工作都在 GPU 上,因此不会影响 CPU 性能。

进一步阅读的东西:

http://blogs.msdn.com/greg_schechter/archive/2006/03/19/555087.aspx

http://blogs.msdn.com/greg_schechter/archive/2006/05/02/588934.aspx

http://blogs.msdn.com/greg_schechter/archive/2006/03/05/544314.aspx

于 2009-05-16T19:02:09.887 回答
8

MSDN 上有一点说全屏模式使用缓冲区翻转,如果设置正确,而不是 blitting。这说得通。

当然,您可以(并且在某种程度上,确实可以)将部分屏幕的独占控制权交给应用程序,但是屏幕的其余部分会发生什么情况呢?您仍然需要在其余窗口上进行 blit、遮挡检查等,我认为这就是导致性能下降的原因。

于 2008-11-20T08:54:32.957 回答
5

我将在@ aib的回答中添加屏幕的其余部分由操作系统管理。因此,如果需要同时绘制/处理其他任何内容,则必须对性能造成影响。

例如,如果您在 Windows Media Player 的一个窗口中播放视频,然后在另一个窗口中启动 Civilization,当 Civ 开始制作精美的图形时,它将需要与其他所有内容共享屏幕空间(例如视频。

而如果 DirectX 应用程序具有全屏,则其他所有内容都可能正在“更新”或“播放”,但不会被绘制。

于 2008-11-20T09:11:49.643 回答
1

基本上,视频硬件完全专用于独占模式应用程序。

不存在视频资源争用(管道、纹理内存等...)

特别是,纹理上传可能是一个很大的瓶颈。你必须做的越少(因为你拥有一切)越好。

于 2009-06-22T05:59:06.157 回答