引自免费微信小程序:皆我百晓生
遇到在调用 swapChain1->Present(1, 0);
时出现 _com_error
或 std::bad_alloc
异常的情况,通常意味着 DirectX 对象在创建、配置或资源分配上存在问题。下面是一些排查和解决这类问题的步骤和建议:
1. 检查 SwapChain 创建和配置
确保 SwapChain 的创建参数正确无误。例如,如果使用的是 Direct3D 12,则需要检查 DXGI_SWAP_CHAIN_DESC1
结构体中的设置是否合理,尤其是 BufferCount
、Width
、Height
和 Format
字段。
2. 资源管理
- 检查内存分配:
std::bad_alloc
异常通常表明内存分配失败。确保在创建 DirectX 对象(如缓冲区、纹理、着色器等)时有足够的系统资源。 - 释放不再使用的资源:确保所有不再使用的 DirectX 资源都被适当地释放,以避免内存泄漏和资源冲突。
3. Debugging DirectX
使用 DirectX 的调试层可以提供更详细的错误信息。在你的代码中加入以下行:
ComPtr<ID3D12Debug> debugController;
if (SUCCEEDED(D3D12GetDebugInterface(IID_PPV_ARGS(&debugController)))) {
debugController->EnableDebugLayer();
}
然后重新编译并运行你的程序,这样可以在出现错误时得到更具体的诊断信息。
4. 检查 DirectX 版本兼容性
确认你的 DirectX 版本与硬件驱动和操作系统兼容。在某些情况下,更新显卡驱动或 DirectX 运行库可能解决问题。
5. 代码示例
下面是一个创建 SwapChain 的简化示例,用于参考:
ComPtr<IDXGIFactory4> factory;
ComPtr<IDXGISwapChain1> swapChain;
// 创建工厂
ThrowIfFailed(CreateDXGIFactory2(0, IID_PPV_ARGS(&factory)));
// 获取适配器信息
ComPtr<IDXGIAdapter1> adapter;
ThrowIfFailed(factory->EnumWarpAdapter(IID_PPV_ARGS(&adapter)));
// 设置 SwapChain 描述
DXGI_SWAP_CHAIN_DESC1 swapDesc = {};
swapDesc.Width = 800;
swapDesc.Height = 600;
swapDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
swapDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
swapDesc.BufferCount = 2; // 双缓冲
swapDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD;
swapDesc.SampleDesc.Count = 1;
// 创建 SwapChain
ThrowIfFailed(factory->CreateSwapChainForHwnd(
commandQueue.Get(), hWnd, &swapDesc,
nullptr, nullptr, &swapChain));
注意上述代码中的 commandQueue
和 hWnd
应当是预先定义好的 Direct3D 12 命令队列和窗口句柄。
6. 使用 Visual Studio 的调试工具
利用 Visual Studio 的调试功能,逐步执行代码,观察在抛出异常前后的变量状态和对象引用。这有助于定位问题的具体原因。
以上步骤应该能帮助你诊断并解决在使用 Direct3D 12 光线追踪和图形渲染时遇到的问题。如果问题仍然存在,考虑查阅 DirectX 官方文档或寻求社区支持。