通过打包顶点缓冲区优化渲染
Optimizing rendering through packing vertex buffers
约翰·卡马克最近发推文:
"Another outdated habit is making separate buffer objects for vertexes
and indexes."
恐怕我不完全明白他的意思。他是在暗示将所有 3D 数据(包括顶点、索引和关节数据)打包到单个顶点缓冲区中比每个单独的缓冲区是最佳的吗?而且,如果是这样,这种技术是否仅适用于 OpenGL 或 Vulkan 渲染器也能受益?
我认为他的意思是没有特别需要将它们放在不同的缓冲区中 objects。您可能不想在 fine-granularity 处交错它们,而是将例如一个缓冲区开头的网格的所有索引,然后是它后面的网格的所有顶点数据,不会比使用单独的缓冲区 objects 更糟糕。使用偏移量将绑定点指向缓冲区中的正确位置。
将它们放在一个缓冲区中是否更好我不知道:如果是的话,我认为这可能是辅助的事情,比如更少的大内存分配往往是一个效率更高一些,您(或 driver)可以在需要副本时做一份大副本而不是两份较小的副本,等等。
编辑:我希望这一切都适用于 GL 和 Vulkan。
John Carmack 回复了关于他的原始推文的答案:
"The performance should be the same, just less management. I wouldn't bother changing old code."
...
"It isn't a problem, it just isn't necessary on modern hardware. No big efficiency to packing them, just a modest management overhead."
所以也许这根本不是一个过时的习惯,尤其是因为它违背了大多数 API 的预期用例,并且在某些情况下可能会破坏兼容性 -
正如 Nico 所说。
约翰·卡马克最近发推文:
"Another outdated habit is making separate buffer objects for vertexes and indexes."
恐怕我不完全明白他的意思。他是在暗示将所有 3D 数据(包括顶点、索引和关节数据)打包到单个顶点缓冲区中比每个单独的缓冲区是最佳的吗?而且,如果是这样,这种技术是否仅适用于 OpenGL 或 Vulkan 渲染器也能受益?
我认为他的意思是没有特别需要将它们放在不同的缓冲区中 objects。您可能不想在 fine-granularity 处交错它们,而是将例如一个缓冲区开头的网格的所有索引,然后是它后面的网格的所有顶点数据,不会比使用单独的缓冲区 objects 更糟糕。使用偏移量将绑定点指向缓冲区中的正确位置。
将它们放在一个缓冲区中是否更好我不知道:如果是的话,我认为这可能是辅助的事情,比如更少的大内存分配往往是一个效率更高一些,您(或 driver)可以在需要副本时做一份大副本而不是两份较小的副本,等等。
编辑:我希望这一切都适用于 GL 和 Vulkan。
John Carmack 回复了关于他的原始推文的答案:
"The performance should be the same, just less management. I wouldn't bother changing old code." ... "It isn't a problem, it just isn't necessary on modern hardware. No big efficiency to packing them, just a modest management overhead."
所以也许这根本不是一个过时的习惯,尤其是因为它违背了大多数 API 的预期用例,并且在某些情况下可能会破坏兼容性 - 正如 Nico 所说。