【发布时间】:2020-08-11 02:34:52
【问题描述】:
我正在开发一个 Vulkan 应用程序,它应该对一些算法进行基准测试。为此,我还想实现一个性能相对较低的算法 - 但当然仍然尽可能优化。
该算法细分了一些基本几何体(目前在 CPU 上,还计划使用计算着色器的版本)。我可能需要更新顶点和索引缓冲区的大小,不幸的是我还没有任何好的指标来猜测大小,所以我只想在所需大小大于当前大小时将分配的内存加倍(如果可行,则减半)。这应该可以合理地最小化内存分配。
我的计划是让 VkDeviceMemory 具有当前最大大小(即 2 的幂),然后将其绑定到可能更小的缓冲区(大小与实际顶点/索引计数相匹配)......但是似乎不可行,因为要查询所需的内存大小,我需要将已经创建的 VkBuffer 传递给vkGetBufferMemoryRequirements。当然,我可以创建具有当前最大大小的缓冲区和设备内存,并告诉正在使用它们的实际大小,但这有点复杂:
我的应用程序使用光线追踪(特别是 KHR 扩展),这意味着这些缓冲区将被传递给 vulkan 的加速结构构建系统,我不完全确定如何告诉该系统要使用缓冲区的哪一部分。以下是加速结构的构建方式:(link to NVIDIA's tutorial)(当然,我必须修改它以允许更新加速结构,而不仅仅是创建它......)。我的猜测是我可以通过VkAccelerationStructureCreateGeometryTypeInfoKHR::maxVertexCount 和maxPrimitiveCount 传递这个号码,但是 vulkan 规格说明:
maxPrimitiveCount描述了可以构建到加速结构几何体中的最大基元数。maxVertexCount描述了当 geometryType 为 VK_GEOMETRY_TYPE_TRIANGLES_KHR 时可用于构建加速结构几何体的最大顶点数。
不幸的是,我不太清楚这是否是我正在寻找的东西。除此之外,缓冲区直接通过VkDeviceAddress 传递给构建系统,我没有看到其他方法可以影响从缓冲区读取的顶点数。
有没有一种明智的方法来做我想做的事情,或者每次我的需求发生变化时,最好简单地创建一个新缓冲区并分配新内存(每个实际大小)?这对性能有多大影响?
【问题讨论】:
标签: vulkan raytracing