与窗口模式相比,Direct3D应用程序在全屏模式下的性能似乎要好得多.这背后的技术原因是什么?
我想这与全屏幕应用程序可以获得显示器的独占控制这一事实有关.但是为什么应用程序无法获得部分屏幕(即窗口)的独占控制权并具有相同的性能优势?
以下是关于事物如何在下面工作的悬崖笔记.
监视器屏幕总是需要与所谓的主表面相关联才能显示任何东西,即视频卡只能扫描出视频存储器中的一个表面.
当应用程序是全屏的(并且所有内容都设置正确以启用翻转)时,主表面只是应用程序后备缓冲区之一,并且每帧都会翻转到另一个后备缓冲区.这是在屏幕上呈现的最有效方式,但它需要应用程序来拥有整个监视区域(即整个主要表面).
当没有全屏应用程序并且DWM关闭时,主表面由OS拥有,并且每个窗口化应用程序执行从应用程序后备缓冲区到主表面的blit.这个blit需要一些GPU时间来完成(以及屏幕上可见的其他应用程序的blits),因此它不如全屏演示效率高.XP以这种方式工作.
当DWM组成屏幕时,事情变得更加复杂.这里,DWM拥有主表面,需要在那里绘制应用程序窗口.为了使它成为可能,每个窗口都有一个相关的表面,其中包含其内容,称为重定向表面(允许DWM启用窗口重影,玻璃效果和所有好东西).每次D3D应用程序发出帧时,它都会向重定向表面添加一个blit.这样,需要发生几个blits:应用程序向重定向表面进行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
有一点 MSDN上写着全屏模式使用缓冲翻转,如果设置正确,而不是块传输.这说得通.
当然,您可以(并且在某种程度上)对应用程序的部分屏幕进行独占控制,但屏幕的其余部分会发生什么?你仍然需要在其余的窗口上进行blit,进行遮挡检查等等,我认为这是导致性能下降的原因.
我将添加@ aib的答案,即屏幕的其余部分由操作系统管理.因此,如果需要同时绘制/处理任何其他内容,则必须有性能影响.
例如,如果您在一个窗口中播放Windows Media Player中的视频,然后在另一个窗口中启动Civilization,当Civ开始执行其花哨的图形时,它将需要与其他所有内容共享屏幕空间(如视频.
如果DirectX应用程序具有全屏,则其他所有内容可能都是"更新"或"正在播放",但不会被绘制.