存储动画顶点数据的最佳方法

时间:2017-06-24 19:19:29

标签: vulkan

根据我的理解,有几种方法可以存储顶点数据并将其传输到GPU。

  • 使用临时临时缓冲区并将其每帧复制到独立的GPU内存
  • 使用共享缓冲区(这很慢?)并且每帧都只更新共享缓冲区
  • 永久存储每个网格的暂存缓冲区,而不是每帧重新创建它并将其复制到GPU

哪种方法最适合存储快速变化的动画网格数据?

1 个答案:

答案 0 :(得分:3)

这取决于它所宣传的硬件和内存类型。请注意,以下所有内容都要求您使用vkGetBufferMemoryRequirements检查内存类型是否可以支持您需要的用法。

如果硬件通告 DEVICE_LOCALHOST_VISIBLE的内存类型,那么您应该使用而不是分段。现在,您仍然需要对此进行双重缓冲,因为您无法写入GPU正在读取的数据,并且您不希望与GPU同步,除非GPU超过帧。这也是你应该衡量的;您的GPU需求可能需要三重缓冲区,因此请将系统设计为灵活。

请注意,某些硬件有两个不同的堆DEVICE_LOCAL,但其中只有一个会有HOST_VISIBLE个内存类型。所以要注意那些情况。

如果没有这样的内存类型(或者内存类型不支持您需要的缓冲区用法),那么您需要对此进行分析。两种选择是:

  • 暂存(通过专用传输队列,如果可用)到DEVICE_LOCAL内存类型,最终使用数据。
  • 直接使用非DEVICE_LOCAL内存类型。

请注意,这两个都需要缓冲,因为您希望尽可能避免同步。通过传输队列进行分段也需要信号量,因为您需要确保图形队列在传输队列完成之前不会尝试使用内存。这也意味着您需要处理第11.7节:如何在队列之间共享资源。

就个人而言,我会尽可能避免 CPU动画顶点数据。具有Vulkan功能的GPU完全能够自行完成任何动画。 GPU已经进行了骨加权蒙皮(甚至是基于双四元数的)十多年了。甚至顶点调色板动画也是GPU可以做的事情;总结各种不同的顶点以达到最终答案。因此,具有大量CPU生成的顶点数据的场景应该相对较少。