2017-06-24 23 views
0

从我所了解的有几种存储和传输顶点数据到GPU的方法。存储动画顶点数据的最佳方法

  • 使用临时分段缓冲器并将其复制到分立的GPU存储器每帧
  • 使用共享缓冲器(这是慢?),只是更新共享缓冲器每帧
  • 存储暂存缓冲器每个网格永久而不是每帧重新创建并将其复制到GPU中

哪种方法最适合用于存储快速更改的动画网格数据?

+1

每帧的带宽需求有多大? PCIe可以传输相当多的数据。 –

+0

所有这些都是转移,我正在寻找最有效的。让我们只是说这是一个复杂的场景,包含大约50个高移动角色的移动角色和一些静态环境网格。所以我们可以说它很高。 – 0xAA55

+2

移动的字符通常不会与GPU蒙皮,几十到一百个矩阵每帧变化而不是数千个顶点。 –

回答

2

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

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

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

如果没有这种内存类型(或者如果内存类型不支持您需要的缓冲区用法),则需要对此进行分析。两个替代方案是:

  • 分段(经由专用传送队列,如果有的话)到DEVICE_LOCAL存储器类型,其中数据最终被使用。
  • 直接使用非DEVICE_LOCAL存储器类型。

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

个人而言,我会尝试避免尽可能CPU动画顶点数据。具有Vulkan功能的GPU可以完全自行完成任何动画。十多年来,GPU一直在进行骨骼加权蒙皮(甚至是基于双四元数的蒙版)。即使顶点调色板动画是GPU可以做的事情;总结各种不同的顶点以达到最终答案。所以有很多CPU生成的顶点数据的场景应该比较少见。

相关问题