根据我的理解,有几种方法可以存储顶点数据并将其传输到GPU。
哪种方法最适合存储快速变化的动画网格数据?
答案 0 :(得分:3)
这取决于它所宣传的硬件和内存类型。请注意,以下所有内容都要求您使用vkGetBufferMemoryRequirements
检查内存类型是否可以支持您需要的用法。
如果硬件通告 DEVICE_LOCAL
和HOST_VISIBLE
的内存类型,那么您应该使用而不是分段。现在,您仍然需要对此进行双重缓冲,因为您无法写入GPU正在读取的数据,并且您不希望与GPU同步,除非GPU超过帧。这也是你应该衡量的;您的GPU需求可能需要三重缓冲区,因此请将系统设计为灵活。
请注意,某些硬件有两个不同的堆DEVICE_LOCAL
,但其中只有一个会有HOST_VISIBLE
个内存类型。所以要注意那些情况。
如果没有这样的内存类型(或者内存类型不支持您需要的缓冲区用法),那么您需要对此进行分析。两种选择是:
DEVICE_LOCAL
内存类型,最终使用数据。DEVICE_LOCAL
内存类型。请注意,这两个都需要缓冲,因为您希望尽可能避免同步。通过传输队列进行分段也需要信号量,因为您需要确保图形队列在传输队列完成之前不会尝试使用内存。这也意味着您需要处理第11.7节:如何在队列之间共享资源。
就个人而言,我会尽可能避免 CPU动画顶点数据。具有Vulkan功能的GPU完全能够自行完成任何动画。 GPU已经进行了骨加权蒙皮(甚至是基于双四元数的)十多年了。甚至顶点调色板动画也是GPU可以做的事情;总结各种不同的顶点以达到最终答案。因此,具有大量CPU生成的顶点数据的场景应该相对较少。