为啥 Direct3D 应用程序在全屏模式下表现更好?
Posted
技术标签:
【中文标题】为啥 Direct3D 应用程序在全屏模式下表现更好?【英文标题】:Why Direct3D application performs better in full screen mode?为什么 Direct3D 应用程序在全屏模式下表现更好? 【发布时间】:2010-09-23 05:03:40 【问题描述】:与窗口模式相比,Direct3D 应用程序在全屏模式下的性能似乎要好得多。这背后的技术原因是什么?
我想这与全屏应用程序可以获得对显示的独占控制这一事实有关。但是为什么应用程序无法获得对屏幕部分的独占控制(即窗口)并具有相同的性能优势?
【问题讨论】:
出于好奇,您在 Vista 上尝试过吗?启用 DWM 后,我在 XNA 应用程序中的系统上体验到窗口模式速度相当高(更高是因为需要更少的填充率,但关键是它并不慢)。 是的,我正在运行启用了 DWM 的 Vista。我还了解到,当全屏应用程序处于活动状态以释放资源时,Vista 会禁用 DWM。 Vista 仅在应用程序不兼容时才禁用 DWM。在全屏模式下(在其他显示器上可见),我有一些使用 Aero Glass 运行良好的游戏。虽然总的来说这是对的,但大多数游戏都会禁用 DWM。 从 Windows 8 开始,您可以使用 DirectFlip 制作蛋糕并吃掉它。基本上,DWM 会检测合成是否是无操作的,而是直接使用您的帧缓冲区,从而为您提供相同的性能。 【参考方案1】:基本上,视频硬件完全专用于独占模式应用程序。
不存在视频资源(管道、纹理内存等)的争用
尤其是纹理上传可能是一个很大的瓶颈。您需要做的事情越少(因为您拥有一切)越好。
【讨论】:
【参考方案2】:这里是关于事情如何运作的悬崖笔记。
显示器屏幕总是需要与所谓的主表面相关联才能显示任何内容,即显卡只能从显存中的一个表面扫描。
当应用程序全屏时(并且所有设置都已正确启用以启用翻转),主表面只是应用程序后台缓冲区之一,并且每帧都会翻转到另一个后台缓冲区。这是在屏幕上呈现的最有效方式,但它要求应用程序拥有整个监视器区域(即整个主表面)。
当没有全屏应用程序且 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
【讨论】:
谢谢大家的解释!我认为这个答案很好地概括了情况。【参考方案3】:我将在@aib 的回答中添加屏幕的其余部分由操作系统管理。因此,如果需要同时绘制/处理其他任何内容,则必须对性能造成影响。
例如,如果您在 Windows Media Player 的一个窗口中播放视频,然后在另一个窗口中启动 Civilization,当 Civ 开始制作精美的图形时,它需要与其他所有内容(如视频)共享屏幕空间。
而如果 DirectX 应用程序具有全屏,则其他所有内容都可能在“更新”或“播放”,但不会被绘制。
【讨论】:
虽然您的最后一句话只是游戏的一部分,但如果您考虑多显示器设置。 我没有在我的原始帖子中声明我在 Vista 中看到了这一点。如果我理解正确的话,启用 DWM 的 Vista 会在硬件中进行窗口位块传输。我想不出比 aib 和你的更好的建议了,但是如果这种额外的 blitting 会大大减慢速度,我会感到困惑。 很公平,@OregonGhost...不过,我试图保持简单:) @smt:实际上可以减慢速度的是,在 Vista 中,3D 设备是共享资源,因此单个应用程序无法完全控制它(在理想世界中)。 【参考方案4】:MSDN 上的 a bit 表示,如果设置正确,全屏模式使用缓冲区翻转,而不是 blitting。有道理。
当然,您可以(并且在某种程度上确实可以)将部分屏幕的独占控制权授予应用程序,但是屏幕的其余部分会发生什么情况呢?您仍然需要在其余窗口上进行 blit、遮挡检查等,我认为这就是导致性能下降的原因。
【讨论】:
如何将屏幕的一部分的独占控制权交给应用程序?我希望它能解决:***.com/questions/1357434/…以上是关于为啥 Direct3D 应用程序在全屏模式下表现更好?的主要内容,如果未能解决你的问题,请参考以下文章
在全屏模式下运行应用程序时,Java Swing 无法找出 JPanel 的问题
在全屏模式下显示状态栏 Ionic for android 和 iOS