我目前正在学习Vulkan.在学习几个教程时,大致相同的代码重复出现:
VkInstance g_instance;
void SetupVulkan(){
VkApplicationInfo appInfo = {};
//Set appInfo attributes
VkInstanceCreateInfo instanceInfo = {};
instanceInfo.pApplicationInfo = &appInfo;
//Set ICI attributes
VkResult result = vkCreateInstance(&instanceInfo, NULL, &g_instance);
//Error handling
}
Run Code Online (Sandbox Code Playgroud)
这会在堆栈上创建一个VkApplicationInfo
和一个VkInstanceCreateInfo
.离开功能并使用时,这是否会导致一些问题g_instance
?被vkCreateInstance
复制的所有数据VkApplicationInfo
和VkInstanceCreateInfo
?如果是这样,为什么官方手册没有告诉我这种行为?https://www.khronos.org/registry/vulkan/specs/1.0/man/html/vkCreateInstance.html
整个API都重复相同的模式.我怎样才能知道堆栈上的分配在哪些情况下是可以的,在哪些情况下应该更喜欢像堆或全局内存那样的更持久的方式?
重要的是要记住哪些对象代表您向Vulkan提供数据,哪些对象代表Vulkan对象或Vulkan向您提供数据.
VkInstance
是一个Vulkan句柄.这意味着它实际上是一个指针或64位整数或某些.您将它用作指向对象的指针,而不是像对象本身.所以它在功能上与此无异:
Type *p
auto error_code = getPtr(&p);
return p;
Run Code Online (Sandbox Code Playgroud)
Vulkan创建的所有对象(即:结果vkCreate
或vkAllocate
调用)都是句柄.它们都像指针/引用一样,所以你可以自由地传递它们而不用担心.
实际的Vulkan结构(如各种Info
对象)可用于输入Vulkan或输出Vulkan.但不管怎样,Vulkan只会在函数调用期间使用它们.那么你之后用它们做什么完全取决于你.
甚至输出数据结构VkPhysicalDeviceFeatures
仍然只是C++结构.并且您以C++允许的任何方式使用它们.其中的数据没有额外的引用或指向Vulkan拥有的内存; 他们只是一堆价值观.
如果你使用VkAllocationCallbacks
,你必须要小心.该实现将在内部存储存储在此结构中的指针.因此,在销毁关联对象之前,它们必须保持有效.但结构本身不会存储超出您提供的Vulkan调用的持续时间.
如果是这样,为什么官方手册没有告诉我这种行为?
它在2.3.1节中确实如此.这适用于Vulkan规范中的每个函数,因此不会单独列出每个函数:
应用程序拥有的内存会立即被传入的任何Vulkan命令使用.应用程序可以在消耗它的命令返回后立即更改或释放此内存.
归档时间: |
|
查看次数: |
179 次 |
最近记录: |