gpt4 book ai didi

c++ - DirectX 异常处理

转载 作者:太空宇宙 更新时间:2023-11-04 16:13:15 25 4
gpt4 key购买 nike

我正在学习有关 DirectX 的 rastertek 教程,同时还学习了 David Abrahams (http://www.boost.org/community/exception_safety.html) 的通用组件中的异常安全。

为什么(据任何人所知)异常处理是按照 rastertek 教程中的方式设置的,它提供什么级别的保护?

例如:

mhresult = D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, 0, &mfeatureLevel, 1,
D3D11_SDK_VERSION, &mswapChainDesc, &mswapChain, &mdevice, NULL, &mdeviceContext);

if (FAILED(mhresult))
{
return false;
}

如果在调用 CreateDevice 时发生未处理的异常,程序不会在我们检查 mhresult 的结果之前崩溃吗?

无论我们是调用一个带有 HResult 返回值的方法还是一个 bool 值,这有什么不同吗?

result = mEstablishHW();
if (!result)
{
return false;
}

是否有替代方法可以在不影响性能的情况下提供强大的异常安全性?

最佳答案

DirectX 是一个 COM基于的 API。并且不允许异常跨越 COM 边界。因此,不存在会抛出的 DirectX 函数。相反,他们使用 C 风格的返回码,称为 HRESULT , 以指示错误。

要有效地使用 DirectX,显然您应该至少学习一些 COM 基础知识。但这里有一些技巧可以让您的初始代码更安全并简化调试:

  • 总是总是总是检查返回码。这并不意味着你应该每次都写if/else。编写一个宏来检查 HRESULT,在“不是 S_OK”的情况下中断调试器,并告诉您它发生的文件、行和函数。您还可以将 HRESULT 转换为可读字符串并将其输出(在控制台中)。
  • 检查输出对象是否有效(即不是“NULL”)是个好主意:mswapChainmdevicemdeviceContext 在你的例子中。
  • 使用 DirectX 调试层:D3D11_CREATE_DEVICE_DEBUG
  • 使用图形诊断工具:one is built into Visual Studio since 2012 , Nvidia Nsight也很好
  • 最后,阅读文档! MSDN 并不完美,但是 DirectX docs写得很好。

无论如何,DirectX 不是开始学习异常安全的API。也许标准库(例如尝试为您的类编写适当的 swap 函数)或 Boost(例如文件系统)会更好地用于此目的。

关于c++ - DirectX 异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25714503/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com