【发布时间】:2021-06-17 03:10:09
【问题描述】:
所以我开始学习 Vulkan,但我还没有对多个对象做过任何事情,问题是,如果我正在制作一个游戏引擎,并且我正在实现某种“拖放”事情,例如,从面板中拖动一个立方体,然后将其放入场景中,是不是更好...?
- 拥有单独的顶点缓冲区。
- 只有一个,让它变得有点像
std::vector类或其他东西,但考虑到每次需要调整大小时我都必须使用命令缓冲区执行传输操作(每次新对象时),这听起来真的很慢被添加到场景中)。
【问题讨论】:
所以我开始学习 Vulkan,但我还没有对多个对象做过任何事情,问题是,如果我正在制作一个游戏引擎,并且我正在实现某种“拖放”事情,例如,从面板中拖动一个立方体,然后将其放入场景中,是不是更好...?
std::vector 类或其他东西,但考虑到每次需要调整大小时我都必须使用命令缓冲区执行传输操作(每次新对象时),这听起来真的很慢被添加到场景中)。【问题讨论】:
不断增长的顶点缓冲区通常是要走的路,请记住,Vulkan 对每种类型的缓冲区句柄都非常有限,并且是为子分配而设计的(就像在老派 C 中一样)。摘自NVIDIA's Vulkan recommendations:
使用内存子分配。 vkAllocateMemory() 在 CPU 上是一项昂贵的操作。通过从大型内存对象进行二次分配可以降低成本。内存分配在具有固定大小的页面中;子分配有助于减少内存占用。
这里唯一的注意是积极地分配你认为它会增长的缓冲区。该页面上的另一点警告您不要将内存推到极限,如果您失败,操作系统将放弃并终止您的程序:
当 Windows 上的内存过度使用时,操作系统可能会暂时挂起 GPU 运行列表中的某个进程,以便调出其分配,为不同进程的分配腾出空间。 Linux 上没有操作系统内存管理器可以通过自动对内存对象执行分页操作来缓解过度使用。
【讨论】: