DirectX异常处理

mit*_*llJ 0 c++ directx exception-handling

我在遵循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;
}
Run Code Online (Sandbox Code Playgroud)

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

是调用带有HResult返回值的方法,还是仅返回布尔值,这是否有所不同?

result = mEstablishHW();
if (!result)
{
    return false;
}
Run Code Online (Sandbox Code Playgroud)

是否有其他方法可以提供强大的异常安全性而又不影响性能?

Iva*_*rop 5

DirectX是基于COM的API。并且不允许异常跨越COM边界。因此,不存在任何DirectX函数。而是使用C样式的返回码(称为HRESULT)来指示错误。

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

  • 总是总是总是检查返回码。这并不意味着您应该if/else每次都写。编写一个宏来检查HRESULT,在出现“ not S_OK”的情况下中断调试器,并告诉您发生了什么文件,行和函数。您还可以将其转换HRESULT为可读的字符串并输出(在控制台中)。
  • 这是一个好主意,检查输出对象,如果它们是有效的(即不是“ NULL“): ,,mswapChain 在你的榜样。mdevicemdeviceContext
  • 使用DirectX调试层:D3D11_CREATE_DEVICE_DEBUG
  • 使用图形诊断工具:自2012年以来Visual Studio就内置了其中一种工具,Nvidia Nsight也非常出色
  • 最后,阅读文档!MSDN并不完美,但是DirectX文档写得很好。

无论如何,DirectX并不是开始学习异常安全性的API。也许Standard库(如尝试为类编写适当的swap函数)或Boost(如文件系统)在此方面会更好地工作。