- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在尝试使用 Vulkan Hpp 唯一句柄来存储缓冲区及其分配的内存时遇到了以下难题。我声明句柄
vk::UniqueBuffer vertex_buffer;
vk::UniqueDeviceMemory vertex_buffer_memory;
并使用 vk::Device::createBufferUnique
和 vk::Device::allocateMemoryUnique
填充它们。这些需要按此顺序调用,因为后者取决于前者的内存要求(通过 vk::Device::getBufferMemoryRequirements
获得)。然而,这会导致 vertex_memory_buffer
在 vertex_buffer
之前被销毁,并触发来自验证层的以下警告:
Validation Warning: [ CHASSIS ] Object 0: handle = 0x558599c91fc0, type = VK_OBJECT_TYPE_DEVICE; Object 1: handle = 0x1b000000001b, type = VK_OBJECT_TYPE_BUFFER; Object 2: handle = 0x1c000000001c, type = VK_OBJECT_TYPE_DEVICE_MEMORY; | MessageID = 0x7366b7dd |
VK Object VkBuffer 0x1b000000001b[] still has a reference to mem obj VkDeviceMemory 0x1c000000001c[].
确实,我查找的所有 C API 示例都是先销毁缓冲区,然后再释放内存。我当然可以使用某种解决方法来确保这里发生同样的情况(例如,默认初始化 vertex_buffer_memory
并在创建 vertex_buffer
后分配给它),但这确实打败了唯一句柄的目的(这正是使资源管理自动化)。除非我误解了什么,否则 Vulkan API 和 RAII 的设计之间似乎存在不兼容性。解决这个问题的正确方法是什么?
最佳答案
These need to be called in this order since the latter depends on the memory requirements of the former
不,他们没有。您确实需要获得适合该缓冲区的内存要求,但您不需要使用那个特定 VkBuffer
对象来执行此操作。
最好在应用程序开始时通过创建代表您的特定用例的 VkBuffer
来计算需求。也就是说,创建一定数量的 VkBuffer
实例,代表您将使用的所有种类缓冲区。
缓冲区的内存要求并不特定于 VkBuffer
对象;有一个bunch of rules in the Vulkan specification定义两个 VkBuffer
的要求相同的情况。因此,如果您创建一个与您实际使用的类似的 VkBuffer
,您可以获得它的要求,并且知道为这些要求分配的内存将适用于您计划使用的内存。
只需遵守这些规则,您就不需要颠倒这些对象的初始化顺序。
此外,为一个缓冲区或图像分配内存几乎总是一个坏主意。 Vulkan 不是 OpenGL,您不应像对待 glBufferStorage
那样对待 vkAllocateMemory
和 vkCreateBuffer
。分配大块内存,然后将其 segmentation 为您认为合适的缓冲区(和图像)。您还可以使用像 VulkanMemoryAllocator 这样的内存管理器为您处理内存管理。
关于c++ - 如何确保正确销毁 vk::UniqueBuffer 和 vk::UniqueDeviceMemory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64632038/
我在尝试使用 Vulkan Hpp 唯一句柄来存储缓冲区及其分配的内存时遇到了以下难题。我声明句柄 vk::UniqueBuffer vertex_buffer; vk::UniqueDeviceMe
我是一名优秀的程序员,十分优秀!