我正在开发一个Vulkan应用程序,它应该对一些算法进行基准测试。为此,我也希望实现一个相对较低的性能算法--当然,它仍然是最优的。
该算法解决了一些基本的几何问题(目前在CPU上,一个使用计算着色器的版本也在计划中)。我可能需要更新顶点和索引缓冲区的大小,不幸的是,我还没有任何很好的指标来猜测大小,所以我只想在所需的内存大于当前大小时将分配的内存增加一倍(如果这样做可行的话,只需增加一半)。这将合理地最小化内存分配。
我的计划是使VkDeviceMemory具有当前最大大小(即2的幂),然后将其绑定到一个可能较小的缓冲区(其大小与实际顶点/索引计数相匹配)。但这似乎不可行,因为要查询所需的内存大小,我需要将已经创建的VkBuffer传递给vkGetBufferMemoryRequirements。当然,我可以用当前的最大大小来创建缓冲区和设备内存,并告诉使用它们的实际大小,但这使它变得有点复杂:
我的应用程序使用光线跟踪(特别是KHR扩展),这意味着这些缓冲区将被传递到vulkan的加速结构构建系统,我不完全确定如何告诉这个系统使用缓冲区的哪一部分。下面是构建加速结构的方式:(链接到NVIDIA的教程) (当然,我必须修改它以允许更新加速结构,而不仅仅是创建它.)。我的猜测是,我可以通过VkAccelerationStructureCreateGeometryTypeInfoKHR::maxVertexCount和maxPrimitiveCount传递这个号码,但是vulkan规范状态:
maxPrimitiveCount描述了可以将构建到加速结构几何中的最大原语数。maxVertexCount描述了当是VK_GEOMETRY_TYPE_TRIANGLES_KHR时,可以用来构建加速结构几何的最大顶点计数。
不幸的是,我不太清楚这是否是我要找的。除此之外,缓冲区通过VkDeviceAddress直接传递给构建系统,我看不出影响从缓冲区读取的顶点数量的另一种方法。
是否有一种明智的方法来完成我想做的事情,还是在每次我的需求发生变化时,最好创建一个新的缓冲区并分配新的内存(每个实际大小)?这对演出会有多糟?
发布于 2020-08-10 18:34:52
不幸的是,我对射线跟踪扩展没有太多的经验,但是有两件事在我的脑海中浮现,可能被证明是有帮助的:
首先,根据我对情况的了解,您可以预先分配一些大型缓冲区,比如它们的池。例如,它们的大小可以增加2倍。这样,您就不必再在测试过程中分配额外的缓冲区了。
第二,您可以使用动态统一缓冲区。只需使最大的一个成为可能,然后绑定由缓冲区内的偏移量设置的描述符。如果统一缓冲区的最大大小不足以满足作业的需要,则可以移动到存储缓冲区;它们也有动态版本。
下面是一些可以从以下内容开始的规范链接:
https://stackoverflow.com/questions/63196353
复制相似问题