【问题标题】:Vulkan: Separate vertex buffers or dynamic vertex buffers?Vulkan:单独的顶点缓冲区或动态顶点缓冲区?
【发布时间】:2021-06-17 03:10:09
【问题描述】:

所以我开始学习 Vulkan,但我还没有对多个对象做过任何事情,问题是,如果我正在制作一个游戏引擎,并且我正在实现某种“拖放”事情,例如,从面板中拖动一个立方体,然后将其放入场景中,是不是更好...?

  • 拥有单独的顶点缓冲区。
  • 只有一个,让它变得有点像std::vector 类或其他东西,但考虑到每次需要调整大小时我都必须使用命令缓冲区执行传输操作(每次新对象时),这听起来真的很慢被添加到场景中)。

【问题讨论】:

    标签: c++ vulkan


    【解决方案1】:

    不断增长的顶点缓冲区通常是要走的路,请记住,Vulkan 对每种类型的缓冲区句柄都非常有限,并且是为子分配而设计的(就像在老派 C 中一样)。摘自NVIDIA's Vulkan recommendations

    使用内存子分配。 vkAllocateMemory() 在 CPU 上是一项昂贵的操作。通过从大型内存对象进行二次分配可以降低成本。内存分配在具有固定大小的页面中;子分配有助于减少内存占用。

    这里唯一的注意是积极地分配你认为它会增长的缓冲区。该页面上的另一点警告您不要将内存推到极限,如果您失败,操作系统将放弃并终止您的程序:

    当 Windows 上的内存过度使用时,操作系统可能会暂时挂起 GPU 运行列表中的某个进程,以便调出其分配,为不同进程的分配腾出空间。 Linux 上没有操作系统内存管理器可以通过自动对内存对象执行分页操作来缓解过度使用。

    【讨论】:

    • 由于我没有接触过任何大型引擎,像Unreal这样的大引擎是如何做到的?他们是否在程序开始时分配了 1GB 的 VRAM 并使其未使用,或者这是怎么回事?
    • 没什么大不了的,你通常知道你在画什么,所以你可以准确地分配你需要多少内存。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多