DirectX12全屏模式FPS骤降问题及合法修复方案咨询
Direct2D Flip Model全屏模式性能异常问题分析与咨询
问题现象
- 窗口模式:使用Direct2D Flip Model渲染两张图片,交换链配置为3个缓冲、无VSync、
Present(0,0)双帧队列,Nvidia Exp Overlay统计帧率约3000FPS,GPU负载60%。 - 全屏模式:无论是调用
IDXGISwapChain::SetFullscreenState还是调整窗口样式/尺寸实现全屏,帧率骤降至500-600FPS,帧时间仍维持0.1-0.2ms,但GPU负载从60%骤降至17%。
临时解决技巧
技巧1:偏移无边框全屏窗口
通过修改窗口样式为无边框,再将窗口偏移1像素并增大1像素尺寸,可维持3000FPS:
SetWindowLong(mainWinHandle, GWL_STYLE, ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZE | WS_MAXIMIZE | WS_SYSMENU | WS_VSCROLL | WS_HSCROLL)); MoveWindow(mainWinHandle, -1, -1, monitorRes.cx + 1, monitorRes.cy + 1, true);
推测此操作是通过欺骗DWM,绕过其对无边框全屏窗口的优化(已尝试禁用DWM优化但无效)。
技巧2:结合SetFullscreenState与窗口调整
调用SetFullscreenState(true, NULL)后再调整窗口(即使坐标尺寸设为0,0及真实分辨率也有效),不仅修复性能下降问题,还将GPU使用率拉满至100%,帧率提升至6000FPS:
swapChain->SetFullscreenState(true, NULL); MoveWindow(mainWinHandle, -1, -1, monitorRes.cx + 1, monitorRes.cy + 1, true);
咨询问题
- 上述现象的根本原因是什么?
- 如何合法合规地修复全屏模式下的性能下降问题,而非依赖这类"欺骗"DWM的技巧?
- 为何默认调用
IDXGISwapChain::SetFullscreenState会导致性能大幅下降?
内容的提问来源于stack exchange,提问作者Fun
相关产品推荐
相关产品推荐

