1. 程式人生 > >Vulkan Cookbook 第三章 18 釋放命令緩衝區

Vulkan Cookbook 第三章 18 釋放命令緩衝區

釋放命令緩衝區

譯者注:示例程式碼點選此處

當不再需要命令緩衝區以及它們未等待在裝置上執行時,可以釋放它們。

怎麼做...

1.獲取邏輯裝置的控制代碼並使用它來初始化名為logical_device的VkDevice型別變數。
2.獲取從邏輯裝置建立的命令池的控制代碼。將此控制代碼儲存在名為command_pool的VkCommandPool型別變數中。
3.建立名為command_buffers的VkCommandBuffer元素型別的向量變數。調整銷量大小,以便能夠儲存應該釋放的所有命令緩衝區。使用應釋放的所有命令緩衝區的控制代碼初始化向量元素。
4.呼叫vkFreeCommandBuffers( logical_device, command_pool, static_cast<uint32_t>(command_buffers.size()), &command_buffers[0] )。提供邏輯裝置和命令池控制代碼、command_buffers向量中的元素數量(要釋放的命令緩衝區的數量),和指向command_buffers向量的第一個元素的指標。
5.出於安全原因,請清除command_buffers向量。

這個怎麼運作...

命令緩衝區可以在組中釋放,但在單個vkFreeCommandBuffers()函式呼叫期間我們只能從同一命令池釋放命令緩衝區。可以一次釋放任意數量的命令緩衝區:

if( command_buffers.size() > 0 ) {
  vkFreeCommandBuffers( logical_device, command_pool, static_cast<uint32_t>(command_buffers.size()), command_buffers.data() );
  command_buffers.clear();
}

提示:在我們釋放命令緩衝區之前,必須確保邏輯裝置沒有引用它們,並且已經完成了提供命令緩衝區的所有提交。

當我們銷燬命令池時,將隱式釋放總給定池分配的命令緩衝區。因此,當我們想要銷燬一個池時,不需要單獨釋放從它分配的所有命令緩衝區。