模型中每个网格的缓冲区是否最佳?

时间:2017-07-19 13:18:31

标签: opengl graphics 3d buffer

我曾经假设绑定顶点比绑定着色器和纹理更重要,但现在我已经知道它是相反的。所以我正在重新配置我的绘图。基本上是:

在每个模型中使用一个缓冲区在模型中绘制多个网格是否最佳?或者是否有另一种解决方案来绑定更少的大缓冲区? (我曾经将所有网格组合成一个大缓冲区并简单地调用偏移量,但现在这意味着我绑定了不必要的顶点,因为它们现在可能被绑定但稍后会使用。)

最佳我的意思是CPU,GPU和驱动程序传输速度。

1 个答案:

答案 0 :(得分:1)

答案当然是"它取决于"并且因GPU,驱动程序和您的应用程序要求而异。

绑定可以是非常轻量级的操作(类似于仅设置指针),或者可能需要将数据从主机(CPU)内存传输到GPU - 它在很大程度上取决于GPU内存中的资源使用和驻留。例如,如果您有许多静态几何体与所有其他图形资源(例如纹理,元素数组等)一起适合GPU内存,那么大缓冲区可能更好,因为您可以初始化它一次,并且司机会很快发现它应该留在那里。

相反,如果你为每个对象使用大量不同的资源(例如,切换大量纹理),所有人都不能同时驻留在GPU中,那么使用较小的缓冲区可能会更好,因为它提供了驱动器通过驱逐来回收内存的更多选项。然而,硬币的另一面是它可能导致内存碎片,并可能浪费一些记忆(尽管如果你关注这一点,你不需要回答这个问题)。

我能提供的最佳建议是,如果您需要更新来自CPU的缓冲区中的数据,请尝试仅更新受这些更改影响的缓冲区域。使用glBufferSubData之类的东西,只更新你需要的区域(并且明智地;例如,如果你需要更新两个1K字节,用几个字节分隔,在一次操作中完成所有操作)。并尝试避免在离散内存GPU系统上使用glMapBuffer和朋友。该操作可能需要从GPU复制大量数据;它对集成内存GPU系统的影响较小(尽管即使这不是具体规则 - 缓冲区可能会重新格式化,以便在幕后进行更优化的内存操作)。

最圣人的建议是:做正确,然后快速(并且只有在它不够快的时候)。