Mai*_*sio 2 directx-12 directxtk windows-11
我非常熟悉基于多个 DirectX 工具包示例构建的 DirectX 12 桌面 x64 应用程序,但现在还支持用于定向和全向阴影、动态反射、硬件实例粒子效果系统、FBX 模型骨骼动画的自定义着色器和景深后处理。
万圣节那天,Windows 更新将我的系统(Intel Core i7[第 8 代]/GeForce GTX1050)升级到 Windows 11。当我运行我的项目时,我收到了一个令人毛骨悚然的惊喜,其形式为以下“源不可用”窗口:
Present()停止调试后,应用程序在调用DeviceResources.cpp时崩溃并生成以下错误:
D3D12 ERROR: ID3D12CommandQueue::Present: Resource state (0x800: D3D12_RESOURCE_STATE_COPY_SOURCE) (promoted from COMMON state) of resource (0x0000011BD5330080:'Render target 0') (subresource: 0) must be in COMMON state when transitioning to use in a different Command List type, because resource state on previous Command List type : D3D12_COMMAND_LIST_TYPE_COPY, is actually incompatible and different from that on the next Command List type : D3D12_COMMAND_LIST_TYPE_DIRECT. [ RESOURCE_MANIPULATION ERROR #990: RESOURCE_BARRIER_MISMATCHING_COMMAND_LIST_TYPE]
D3D12: **BREAK** enabled for the previous message, which was: [ ERROR RESOURCE_MANIPULATION #990: RESOURCE_BARRIER_MISMATCHING_COMMAND_LIST_TYPE ]
Exception thrown at 0x00007FFA0F6A466C (KernelBase.dll) in DXTK12 Game.exe: 0x0000087A (parameters: 0x0000000000000001, 0x00000014297FC640, 0x00000014297FE420).
Unhandled exception at 0x00007FFA0F6A466C (KernelBase.dll) in DXTK12 Game.exe: 0x0000087A (parameters: 0x0000000000000001, 0x00000014297FC640, 0x00000014297FE420).
Run Code Online (Sandbox Code Playgroud)
这种情况在 Windows 10 中从未发生过,而且这种崩溃是不稳定的。我的游戏配置为以无边框全屏模式启动,有时会运行几秒钟然后崩溃。如果我有时间按 Alt+Enter 进入窗口模式,应用程序仍然会崩溃。
我已更新我的 Nvidia 驱动程序并将项目指向最新的 Windows 11 SDK 版本 (10.0.22000.0),但问题仍然存在。
经过一番谷歌搜索后,有证据表明 Windows 11 上存在一个与不稳定的 DXGI/WDM 行为有关的已知问题,在模拟全屏(即无边框窗口)模式下运行游戏的用户报告了这一问题。我还遇到了崩溃后 Alt+Tab 窗口切换行为错误的问题,但这似乎已通过图形驱动程序更新修复。
是否有其他开发人员在 Windows 11 上遇到过 DirectX 12 的稳定性和/或性能问题?或者我应该静观其变,等待未来的 Windows 更新来稳定新操作系统?
这是 DXGI 调试层与 Windows 11 的 DX12 调试层交互中的一个错误。有一个简单的解决方法是抑制D3D12_MESSAGE_ID_RESOURCE_BARRIER_MISMATCHING_COMMAND_LIST_TYPE. 该错误本身将在未来的 Windows 更新中修复。
在处理“混合图形”系统(即同时具有英特尔集成和独立 GPU 的笔记本电脑)时,调试层总是有一些怪癖,因此我在与其相关的 DeviceResources 实现中存在一些抑制:
DXGI_INFO_QUEUE_MESSAGE_ID hide[] =
{
80 /* IDXGISwapChain::GetContainingOutput: The swapchain's adapter does not control the output on which the swapchain's window resides. */,
};
DXGI_INFO_QUEUE_FILTER filter = {};
filter.DenyList.NumIDs = static_cast<UINT>(std::size(hide));
filter.DenyList.pIDList = hide;
dxgiInfoQueue->AddStorageFilterEntries(DXGI_DEBUG_DXGI, &filter);
Run Code Online (Sandbox Code Playgroud)
D3D12_MESSAGE_ID hide[] =
{
D3D12_MESSAGE_ID_MAP_INVALID_NULLRANGE,
D3D12_MESSAGE_ID_UNMAP_INVALID_NULLRANGE,
// Workarounds for debug layer issues on hybrid-graphics systems
D3D12_MESSAGE_ID_EXECUTECOMMANDLISTS_WRONGSWAPCHAINBUFFERREFERENCE,
D3D12_MESSAGE_ID_RESOURCE_BARRIER_MISMATCHING_COMMAND_LIST_TYPE,
};
D3D12_INFO_QUEUE_FILTER filter = {};
filter.DenyList.NumIDs = static_cast<UINT>(std::size(hide));
filter.DenyList.pIDList = hide;
d3dInfoQueue->AddStorageFilterEntries(&filter);
Run Code Online (Sandbox Code Playgroud)
该解决方法包含在我的 Direct3D 游戏模板 VSIX 的2021 年 10 月版本中。查看此提交
D3D12_MESSAGE_ID_EXECUTECOMMANDLISTS_WRONGSWAPCHAINBUFFERREFERENCE在混合图形系统上处理“丢失设备”期间可能会触发该错误。此问题是在 Windows 10 (18363) 中引入的。现在应该已修复,因此理论上您可以删除 Windows 11 的抑制。在此提交中添加了抑制。
Windows 10 (17134) 中引入了“IDXGISwapChain::GetContainingOutput”DXGI 警告。在此提交中添加了抑制。
| 归档时间: |
|
| 查看次数: |
3666 次 |
| 最近记录: |