1

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

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

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

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

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

4

1 回答 1

1

显示列表和 VBO 通常对琐碎的几何图形没有帮助。如果我从蓝色的 OpenGL 书中没记错的话,有时他们甚至可以减慢速度。

显示列表在 OpenGL 1.x 中“尽善尽美”,但在引入 VBO 时被视为遗留功能。

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

使用 OpenGL 2.x 或 1.xARB 扩展,您可以将变换放在统一矩阵中,然后为每个模型更新统一。由于更新制服也很慢,因此这并不能真正为您带来太多好处。

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

话虽如此,使用 VBO 重新设计它并提供属性转换可能需要大量工作才能获得 8% 的 CPU 使用率增益。可能是 2.0ghz core 2 duo 的一个核心 8%

编辑

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

于 2011-11-04T21:07:14.383 回答