使用一个vao和一个缓冲区之间是否存在任何性能差异(VAO将捕获glVertexAttribPointer调用一个VBO),并使用一个vao和多个缓冲区(VAO将捕获glVertexAttribPointer调用不同的VBO)。 ?
在这两种情况下,我必须在绘制之前将VAO绑定一次,但此绑定调用的执行时间是否会更改?
答案 0 :(得分:6)
简而言之,是的,但实际上,执行时间非常短,可以忽略不计。如果您正在制作任何动态场景,通常需要多个顶点缓冲区。将所有内容放在一个缓冲区中只会使事情复杂化。记住格言:从不优化早期。
答案 1 :(得分:1)
是的,它会变慢。为什么?因为渲染过程现在必须访问来自不同VBO的数据,以便为一个顶点提供一个数据。数据在内存中传播,而如果所有内容都在一个VBO中,则数据会“交错”。这会导致更快的内存访问时间。
答案 2 :(得分:0)
理论上如果你使用一个VBO然后你不会导致很多缓存未命中,但如果你有很多顶点,每个都有位置,正常,紫外线,颜色,切线,...然后驱动程序可能决定将数组存储在客户端内存中,因此在这种情况下使用多个VBO是有意义的。 personnaly我使用多个VBO,无论大小如何。
答案 3 :(得分:-1)
在您的问题中,您假设您将仅使用VAO。在最近的OpenGL版本中,VAO是强制性的,但你可以在没有VAO的情况下生存(只需在初始化时绑定1个VAO,然后你就会忘记它:这个解决方案被广泛使用)。
为每个VBO使用VAO更快,或者为每个VBO调用glVertexAttribPointer?这是依赖于驱动程序。优化一个驱动程序时所冒的风险是让另一个驱动程序的速度变慢。
使用许多VBO或少量VBO更快(它不依赖于您的VAO)?这取决于你的瓶颈:
越来越多的VBO可能有助于视锥体剔除或遮挡剔除有效地减少GPU的工作量(减少过度绘制和更少的原始处理),但过多的VBO可能导致最坏的情况更多 drawcalls 无论如何都会放慢速度。
没有更好的解决方案,这完全取决于您的问题和分析。