游戏环境中的OpenGL VBO / DisplayList

时间:2011-11-03 23:02:39

标签: performance opengl vbo displaylist

我正在开发一个小游戏(使用OS X Lion,Xcode 4,Objective-C / C ++,Cocoa,OpenGL)。这是一个相当简单的概念。我有一些在二维数组内移动的物体。现在我想为我的游戏编写一个OpenGL GUI。

我所做的是通过我的数组并为其中的每个对象绘制一个立方体,在其特定位置,具有取决于对象类型的纹理。当然,我的第一个天真实现有点CPU密集,所以下一步是实现纹理图集。由于我有很多顶点,因此仍有很大的改进空间。

我读到VBO和DisplayLists要快得多。我学习了一些教程,但是在真正的动态游戏环境中我仍然有很多关于实现的问题。

假设我为我的游戏对象编译了一些显示列表。如果我想把它放在一个特定的位置,我必须glTranslatef()。但是很多glTranslatef()可能会占用大量CPU资源。我该如何处理?当然,我可以在每个可能的位置为每种类型的游戏对象创建一个显示列表,但这似乎不切实际,而且它只会起作用,因为我的游戏是基于图块的......

维多利亚州立大学似乎也遇到了同样的问题。当然(至少从我的理解中)我可以创建一个完整的顶点网格,然后遍历我的数组,并为每个对象渲染一个与对象位置相关联的顶点立方体。但我不知道如何将纹理从整个顶点网格应用到特定的立方体。我是否必须为网格内的每个立方体面创建纹理坐标,还是足以为立方体的所有6个面创建纹理坐标?

1 个答案:

答案 0 :(得分:1)

显示列表和VBO通常对简单的几何体没有帮助。如果我从蓝色的OpenGL书中正确地回忆起来,有时他们甚至可以放慢速度。

OpenGL 1.x中的显示列表“尽可能好”,但随着VBO的推出被认为是遗留功能。

如果我们知道您的OpenGL目标版本是什么,这将有所帮助。在使用立即模式的OpenGL 1.x中,你要做的就是设置你的“相机矩阵”(OpenGL没有,你只需将它的转置留在矩阵堆栈上),然后在渲染循环中为每个模型推送和弹出基质。

使用OpenGL 2.x或1.xARB扩展,您可以将变换放在统一的基质中,然后更新每个模型的统一。这并没有真正为你买单,因为更新制服也很慢。

我认为你能做的最好的事情就是在着色器中为OpenGL提供一组(一组)属性matricies。这将通过一次性传输所有数据来减少您的CPU开销。我无法想到技术实现细节,但我认为属性是每个顶点所以你必须传递一个索引,在哪里查看你用来放置变换的另一个缓冲区。我从来没有这样做过,因为大多数模型包含的几何和纹理信息比设置变换的时间要多。

话虽这么说,用VBO重新设计它并提供属性转换可能需要大量工作才能获得8%的CPU使用率。可能是2.0ghz核心2组合的一个核心8%

修改

统一缓冲对象是我真正想要的。可能是统一的块布局。蓝皮书(可能是橙皮书)和谷歌有更多细节。