在 Direct3D 12 应用程序中,全屏真的比窗口模式好吗?

Is fullscreen really better than windowed mode in a Direct3D 12 application?

我正在尝试学习 Direct3D 12 来做一些简单的 3D 图形来获得乐趣。

我听说纯全屏是获得最大 fps 的方法,但现在我正在测试它,全屏似乎比 windowed 模式差得多。

例如,WS_BORDER window 上的静态颜色(全屏大小),WindowedDXGI_SWAP_CHAIN_FULLSCREEN_DESC 中设置为 TRUE,可以在我的电脑上以大约 5000 fps 的速度渲染(使用三重缓冲)。

另一方面,WS_POPUP window、Windowed 的静态颜色在 DXGI_SWAP_CHAIN_FULLSCREEN_DESC 和 [=18] 中设置为 FALSE =] 调用,仅以大约 3000 fps 的速度渲染(使用三重缓冲)。

应该是这种情况还是我遗漏了什么?

Direct3D 的“全屏”故事是一个复杂的故事,而从另一个comments/answers 在这个线程中仍然是一个混乱的故事。

对于 Windows 10 上的 DirectX 12,没有全屏独占模式 (FSE)。当您将 SetFullscreenState 与现代 DXGI_SWAP_EFFECT_FLIP_DISCARDDXGI_SWAP_EFFECT_FLIP_SEQUENTIAL 效果模式中的任何一个一起使用时,实际使用的是 模拟全屏独占模式 (eFSE)。 DirectX 12 不支持使用较旧的 'blt-style' 效果 DXGI_SWAP_EFFECT_DISCARDDXGI_SWAP_EFFECT_SEQUENTIAL.

如果您 运行 使用无边框 window 在“windowed 模式下最大化覆盖整个屏幕”,其性能与使用“eFSE”相同。

有些第 3 方视频卡供应商 API 和场景要求您使用“全屏模式”而不是“windowed 模式”,因此在这些情况下存在差异。

另一个问题是,如果您尝试更改 显示模式 与使用 原始分辨率 。这里的性能影响是渲染目标大小的“像素填充”率。有一些技术可以通过渲染到 'offscreen' 渲染目标大小来缩放性能,然后将其缩放到后台缓冲区的原始分辨率与更改显示模式以尝试减小后台缓冲区的大小。

参见 The Care and Feeding of Modern Swap Chains and Demystifying Fullscreen Optimizations