【问题标题】: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 会检测合成是否是无操作的,而是直接使用您的帧缓冲区,从而为您提供相同的性能。

标签: performance directx fullscreen direct3d


【解决方案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、遮挡检查等,我认为这就是导致性能下降的原因。

    【讨论】:

    猜你喜欢
    • 2021-05-14
    • 2010-11-16
    • 2012-01-12
    • 2010-11-20
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    • 2015-06-28
    • 1970-01-01
    相关资源
    最近更新 更多