与窗口模式相比,Direct3D应用程序在全屏模式下的性能似乎要好得多。这背后的技术原因是什么?
我想这与全屏应用程序可以获得显示器的独占控制这一事实有关。但是为什么应用程序无法获得对屏幕(即窗口) part 的独占控制权并具有相同的性能优势?
答案 0 :(得分:23)
以下是关于事情如何在下面工作的悬崖笔记。
监视器屏幕始终需要与所谓的主要表面相关联才能显示任何内容,即视频卡只能扫描出视频内存中的一个表面。
当应用程序是全屏时(并且所有内容都已正确设置以启用翻转),主表面只是应用程序后备缓冲区之一,并且每帧都会翻转到另一个后备缓冲区。这是在屏幕上呈现的最有效方式,但它需要应用程序来拥有整个监视区域(即整个主要表面)。
当没有全屏应用程序并且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
答案 1 :(得分:8)
MSDN上有a bit表示全屏模式使用缓冲区翻转(如果设置正确),而不是blitting。这很有道理。
当然,您可以(并且在某种程度上)对应用程序的部分屏幕进行独占控制,但屏幕的其余部分会发生什么?你仍然需要在其余的窗口上进行blit,进行遮挡检查等,我认为这是导致性能下降的原因。
答案 2 :(得分:5)
我将添加@ aib的答案,即屏幕的其余部分由操作系统管理。因此,如果需要同时绘制/处理任何其他内容,则必须有性能影响。
例如,如果您在一个窗口中播放Windows Media Player中的视频,然后在另一个窗口中启动Civilization,当Civ开始执行其花哨的图形时,它将需要与其他所有内容共享屏幕空间(如视频。 / p>
如果DirectX应用程序具有全屏,则其他所有内容可能都是“更新”或“正在播放”,但不是正在绘制。
答案 3 :(得分:1)
基本上,视频硬件完全专用于独占模式应用。
视频资源(管道,纹理内存等)没有争用
特别是纹理上传可能是一个很大的瓶颈。你必须做的越少(因为你拥有它),就越好。