Opengl 组织VBO并优化对glDrawArrays()的调用

Opengl 组织VBO并优化对glDrawArrays()的调用,opengl,Opengl,我试图找出OpenGL中不同技术的优缺点。我正在阅读的教程建议在渲染大量VBO时提高性能,我推断一种方法可能是在单个VBO中存储多个对象 关于如何/为什么组织和呈现数据,有什么好的经验法则吗?对于一款现代视频游戏,比如说“现代战争”,如果我看到的场景背景是天空、几座静止的建筑、大量的碎片和10个NPC,你认为他们创建了多少VBO,以及对glDrawArrays()的调用次数是多少?Draw调用并不是最昂贵的事情;我相信每帧有100~1000次抽签调用是很常见的 性能的一个重要方面是减少状态更改。

我试图找出OpenGL中不同技术的优缺点。我正在阅读的教程建议在渲染大量VBO时提高性能,我推断一种方法可能是在单个VBO中存储多个对象


关于如何/为什么组织和呈现数据,有什么好的经验法则吗?对于一款现代视频游戏,比如说“现代战争”,如果我看到的场景背景是天空、几座静止的建筑、大量的碎片和10个NPC,你认为他们创建了多少VBO,以及对glDrawArrays()的调用次数是多少?

Draw调用并不是最昂贵的事情;我相信每帧有100~1000次抽签调用是很常见的

性能的一个重要方面是减少状态更改。IIRC程序更改>纹理更改>缓冲区更改。对抽签呼叫进行排序,以便尽可能少地切换内容


使用一个大型VBO而不是几个较小的VBO可能有助于提高性能,但这可能不是我首先要尝试的事情。

VAO在这种成本层次结构中的位置如何?我想这就像是切换缓冲区,因为这几乎就是它所做的。我听说切换VAO比只使用一个VAO并根据需要重新绑定缓冲区要慢一些。但现在这可能是老消息了。您知道有哪些资源讨论VBO的数据组织吗?例如,如果我在做一个棋类游戏,我可能会创建7个VBO:一个用于棋盘格、棋子、主教、车、骑士、女王和国王。或者,我可以创建33个VBO来容纳每一块和整个电路板。(或者一个VBO来容纳整个工具包和卡布多。)除了或多或少地说“VBO比客户端数据更受欢迎”的指南之外,我还没有找到任何关于这方面的内容。有关于这个主题的教程或示例吗?VBO只是分配的内存块,想想
glBufferData
=
malloc
+
memcpy
。这里的问题是“如何在GPU内存中安排我的数据”,细节如“是否交错属性”。尝试