You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows 11系统下DirectX 12应用调用Present()崩溃问题求助

针对D3D12 Present调用崩溃问题的解决方案

核心问题原因

你遇到的错误是Win11 DXGI运行时收紧资源状态检查导致的合规性报错,Win10时期的运行时对隐式状态转换的容错度更高,所以没有触发崩溃。Win11的无边框模拟全屏模式默认会启用后台COPY队列处理自动HDR、屏幕录制、窗口合成等逻辑,会直接访问你的交换链后背缓冲,你的代码没有显式处理跨命令队列的资源状态转换,因此触发状态冲突。

可落地修复步骤

  • 首先修改DeviceResources.cpp中的资源屏障逻辑:在调用Present()之前,显式将当前后背缓冲资源(即报错中的Render target 0)通过资源屏障转换到D3D12_RESOURCE_STATE_COMMON状态,不要依赖DXGI的隐式转换。原有DirectX Tool Kit示例默认仅转换到D3D12_RESOURCE_STATE_PRESENT,在Win11模拟全屏场景下不再兼容。
  • 完成Present()调用后,再显式将后背缓冲转换回D3D12_RESOURCE_STATE_RENDER_TARGET状态即可,这一修改完全向下兼容Win10系统。

临时验证方案

如果需要快速定位是否为Win11模拟全屏优化导致的问题,可以做如下测试:

  • 右键点击你的游戏exe文件,选择「属性-兼容性」,勾选「禁用全屏优化」后重新运行,若崩溃不再触发即可确认问题根因。
  • 也可以临时修改交换链初始化逻辑,优先使用独占全屏模式而非无边框模拟全屏,独占模式下不会触发DXGI后台COPY队列逻辑,可规避该错误。

关于系统更新的说明

微软已经在Win11 22H2及后续版本的累积更新中修复了多个DXGI资源状态冲突的已知问题,你可以安装最新系统更新后测试,但优先建议完成上述代码修改,显式管理资源状态本身就是D3D12应用的标准最佳实践,Win10下未报错仅属于运行时容错,不代表原有代码完全符合D3D12规范。


内容的提问来源于stack exchange,提问作者Maico De Blasio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 14:06:03