2017-07-07 86 views
-2

最近我想知道一个游戏,如果有很多模型,并且他们每个人都需要顶点缓冲区来绘制。就像下面三个选项一样,哪一个最有效?不使用暂存缓冲区的原因是什么?

  1. 创建几个小顶点缓冲区并在绘制这些模型之前用vkMapMemory更新它。
  2. 创建几个小顶点缓冲区并使用分段缓冲区进行更新。
  3. 创建足够大的顶点缓冲区并使用它。
+1

我不明白你的问题标题。此外,它似乎与问题内容不相关。你还需要详细说明#3 - 你不清楚你的意思;大缓冲没有**不会以某种方式免除您对内存传输的需求。 – krOoze

回答

5

你在混淆两个不同的问题......内存管理和内存更新。

对于内存管理,OpenGL和Vulkan的传统观点是,您希望在底层API中进行少量分配,并自己进行内存管理,以便可以将多个顶点数据集以不同的偏移量存储在单个缓冲区中。这对于能够进行间接绘制至关重要,因为您可以在其中执行单个命令来绘制多个模型。因为您不能更改该命令中的绑定,所以您只能渲染全部位于单个顶点缓冲区内的模型。

对于内存更新,您需要记住并非所有内存都必须使用vkMapMemory进行映射。通常只能映射系统内存,而GPU本地内存则不能。当顶点数据位于GPU上时,最佳性能将会达到,因此最佳做法是使用由可映射内存组成的暂存缓冲区,然后使用它将其转移到设备本地内存的实际缓冲区。

+0

感谢您的澄清,使用间接绘图可以在单个命令中呈现多个模型,但不受许多平台的支持。 是否有其他选项可以渲染多个模型,特别是那些模型有其自己的顶点缓冲区。 – james

+0

据我所知,所有Vulkan实现和大多数桌面OpenGL实现(支持4.3及更高版本的任何东西)都支持间接多重绘制。 – Jherico

+0

真的吗?例如,你有没有试过在高通平台上询问关于这个特性的vulkan支持? – james