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

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

有帮助吗?

解决方案

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

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

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

当没有全屏应用程序并且DWM关闭时,主表面由OS拥有,并且每个窗口化应用程序执行从应用程序后备缓冲区到主表面的blit。这个blit需要一些GPU时间来完成(以及屏幕上可见的其他应用程序的blits),因此它不如全屏显示效率高。 XP以这种方式工作。

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

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

进一步阅读:

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

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

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

其他提示

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

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

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

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

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

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

视频资源(管道,纹理内存等)没有争用

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top