我什么时候应该使用VULKAN_水电站无例外? 这个问题是关于(Vulkan官方C++绑定)中的异常处理。< /P>

我什么时候应该使用VULKAN_水电站无例外? 这个问题是关于(Vulkan官方C++绑定)中的异常处理。< /P>,c++,exception-handling,vulkan,C++,Exception Handling,Vulkan,我使用Vulkan Hpp编写了一个小应用程序,没有定义Vulkan\u Hpp\u无异常(以及异常处理程序)。但是在遇到这个stackoverflow问题()之后,我开始担心在那里使用异常会带来什么后果。然后我发现了defineVULKAN\u HPP\u NO\u异常,但它完全改变了所有可能引发异常的调用的语法(因为返回值不同):这意味着,在开始实现之前必须决定是否使用VULKAN\u HPP\u NO\u异常(即,无法为“调试”配置和“发布”配置禁用(很容易) 如果通过定义VULKAN\u

我使用Vulkan Hpp编写了一个小应用程序,没有定义
Vulkan\u Hpp\u无异常
(以及异常处理程序)。但是在遇到这个stackoverflow问题()之后,我开始担心在那里使用异常会带来什么后果。然后我发现了define
VULKAN\u HPP\u NO\u异常
,但它完全改变了所有可能引发异常的调用的语法(因为返回值不同):这意味着,在开始实现之前必须决定是否使用
VULKAN\u HPP\u NO\u异常
(即,无法为“调试”配置和“发布”配置禁用(很容易)

如果通过定义
VULKAN\u HPP\u NO\u异常来禁用异常处理
ResultValue::type
是一个包含返回值的结构 值以及字段结果和值中的错误代码

i、 e

变成

vk::ResultValue<vk::SurfaceKHR> surfaceResult = instance.createWin32SurfaceKHR(surfaceCreateInfo);
if (surfaceResult.result == vk::Result::eSuccess) {
  surface = surfaceResult.value;
}
vk::ResultValue surfaceResult=instance.createWin32SurfaceKHR(surfaceCreateInfo);
if(surfaceResult.result==vk::result::esucces){
表面=表面结果值;
}
因此,考虑到在开发的后期阶段更改有关
VULKAN\u HPP\u NO\u异常的策略并非微不足道,我想知道在哪些情况下我应该为我的项目使用
VULKAN\u HPP\u NO\u异常
,在哪些情况下我不应该使用


我认为这背后一定有一些技术原理,而不仅仅是个人喜好/观点。

可以禁用异常的主要原因是,各种平台的许多游戏开发人员在编译器级别关闭异常处理。在某些平台上,完全不支持异常处理。这些平台仍然不支持我们需要一种合理的方法来处理错误,这需要不同的API

<>异常是C++中一个热门话题,而且可能总是如此。尽管C++程序员会同意例外情况只在特殊情况下使用,但“例外情况”和“预期行为”之间的界限最终还是在旁观者眼中。

我个人认为,Vulkan错误是“特殊情况”。设备丢失和OOM错误不是您经常期望发生的事情。此外,您对它们的响应可能肯定是非本地的;在调用堆栈中更高的代码将是实际处理的。 此外,许多出错的函数不是性能关键型Vulkan代码中常见的函数(
vkCmd*
,诸如此类)毕竟,使用错误应该由验证层来处理,并且在运行时应该是不可能的。错误通常被用于对象创建/销毁和分配,这不是在构建命令缓冲区中间所做的事情。

最有可能在性能关键代码中找到的出错函数是
vkAllocateDescriptorSets
。虽然它可能会出错,但只能出于内存碎片的原因。该标准实际上要求:

除了
VK\u error\u OUT\u OF_POOL\u MEMORY\u KHR
VK\u error\u FRAGMENTED\u POOL
之外,任何返回的错误都不意味着其通常的含义:应用程序应该假设分配由于碎片而失败,并创建一个新的描述符池

如果您对输入数据有严格的控制,通常可以防止碎片化。有了这种控制,您可以确保在从描述符池进行分配时不会出错

vkBegin/EndCommandBuffer
可能会出错,但仅限于OOM原因。这通常意味着您无法进行恢复,因此性能无关紧要

给出需要操作的严重运行时错误的命令通常是设备命令。并且在渲染过程中不发出这样的命令;<代码> VKQueLeSubMIb> <代码>是一个例外,这是在渲染结束时(或开始;然而您希望看到它)。


这可能就是为什么默认使用VK_HPP的原因。

可以禁用异常的主要原因是各种平台的许多游戏开发人员在编译器级别关闭异常处理。在某些平台上,完全不支持异常处理。这些平台仍然需要合理的方法来处理错误,这需要一个不同的API

<>异常是C++中一个热门话题,而且可能总是如此。尽管C++程序员会同意例外情况只在特殊情况下使用,但“例外情况”和“预期行为”之间的界限最终还是在旁观者眼中。

我个人认为,Vulkan错误是“特殊情况”。设备丢失和OOM错误不是您经常期望发生的事情。此外,您对它们的响应可能肯定是非本地的;在调用堆栈中更高的代码将是实际处理的。 此外,许多出错的函数不是性能关键型Vulkan代码中常见的函数(
vkCmd*
,诸如此类)毕竟,使用错误应该由验证层来处理,并且在运行时应该是不可能的。错误通常被用于对象创建/销毁和分配,这不是在构建命令缓冲区中间所做的事情。

最有可能在性能关键代码中找到的出错函数是
vkAllocateDescriptorSets
。虽然它可能会出错,但只能出于内存碎片的原因。该标准实际上要求:

除了
VK\u error\u OUT\u OF\u POOL\u MEMORY\u KHR
VK\u error\u FRAGMENTED\u POOL
之外,任何返回的错误都不意味着其通常的含义:应用程序应假定
vk::ResultValue<vk::SurfaceKHR> surfaceResult = instance.createWin32SurfaceKHR(surfaceCreateInfo);
if (surfaceResult.result == vk::Result::eSuccess) {
  surface = surfaceResult.value;
}