最近我在想一个游戏,如果有很多模型,每个模型都需要顶点缓冲区来绘制。比如以下三个选项,哪一个最有效?
- 在绘制这些模型之前,创建几个小的顶点缓冲区并使用 vkMapMemory 对其进行更新。
- 创建几个小顶点缓冲区并使用临时缓冲区进行更新。
- 创建几个足够大的顶点缓冲区并使用它。
你把两个不同的问题混为一谈了......内存管理和内存更新。
对于内存管理,OpenGL 和 Vulkan 的传统智慧是,您希望在底层 API 中进行少量分配并自己进行内存管理,以便您可以将多个顶点数据集存储在不同偏移量的单个缓冲区中。 这对于能够执行间接绘图至关重要,在间接绘图中,您可以执行单个命令来渲染多个模型。 由于无法更改该命令中的绑定,因此只能呈现所有位于单个顶点缓冲区内的模型。
对于内存更新,您需要记住,并非所有内存都必须使用vkMapMemory
进行映射。 通常只能映射系统内存,而 GPU 本地内存不能。 当顶点数据位于 GPU 上时,最佳性能将到来,因此最佳做法是使用由可映射内存组成的暂存缓冲区,然后使用它传输到设备本地内存的实际缓冲区。