1

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

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

例如,WS_BORDER窗口上的静态颜色(全屏大小)并Windowed设置为TRUEDXGI_SWAP_CHAIN_FULLSCREEN_DESC可以在我的计算机上以大约 5000 fps 的速度渲染(使用三重缓冲)。

另一方面,WS_POPUP窗口上的静态颜色,Windowed设置为FALSE并且DXGI_SWAP_CHAIN_FULLSCREEN_DESCIDXGISwapChain3::SetFullscreenState(TRUE, nullptr)称为,仅以大约 3000 fps 的速度渲染(使用三重缓冲)。

应该是这种情况还是我错过了什么?

4

1 回答 1

2

Direct3D 的“全屏”故事是一个复杂的故事,从这个线程中的其他评论/答案来看,这仍然是一个令人困惑的故事。

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

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

有一些 3rd 方显卡供应商 API 和场景需要您使用“全屏模式”而不是“窗口模式”,因此在这些情况下存在差异。

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

请参阅现代交换链的维护和提供以及揭开全屏优化的神秘面纱。

于 2021-02-10T20:33:22.727 回答