【发布时间】:2011-11-03 23:02:38
【问题描述】:
我正在开发一个小游戏(使用 OS X Lion、Xcode 4、Objective-C / C++、Cocoa、OpenGL)。这是一个相当简单的概念。我有一些在二维数组中移动的对象。现在我想为我的游戏编写一个 OpenGL GUI。
我所做的是遍历我的数组并为其中的每个对象绘制一个立方体,在其特定位置,其纹理取决于对象的类型。当然,我的第一个简单实现有点 CPU 密集型,所以下一步是实现纹理图集。由于我有很多顶点,还有很大的改进空间。
我了解到 VBO 和 DisplayList 的速度要快得多。我完成了一些教程,但我仍然对在真实动态游戏环境中的实现有很多疑问。
假设我为我的游戏对象编译了一些显示列表。如果我想把它放在一个特定的位置,我必须 glTranslatef()。但是很多 glTranslatef() 可能会占用大量 CPU。我该如何处理?当然,我可以在每个可能的位置为每种游戏对象创建一个显示列表,但这似乎不切实际,而且它只会起作用,因为我的游戏是基于图块的......
VBO 似乎也遇到了同样的问题。当然(至少根据我的理解)我可以创建一个完整的顶点网格,然后遍历我的数组并为每个对象渲染一个与对象位置相关联的顶点立方体。但我不明白如何将纹理从整个顶点网格应用于特定立方体。我是否必须为网格内的每个立方体面创建纹理坐标,还是为立方体的所有 6 个面创建纹理坐标就足够了?
【问题讨论】:
-
“但是很多 glTranslatef() 可能会占用大量 CPU。”所以?你说你在做“一个小游戏”。你有理由相信一些矩阵乘法会显着降低你的游戏性能吗?除非您有数十万个对象,否则这并不重要。这个问题有过早优化的味道。不要沉迷于“OMGFASTER!!!!11”只要让它发挥作用;您会惊讶于显而易见的解决方案经常足够快。
-
嗯,我有大约 25*40 块大小的关卡,大约有 1000 个对象。我正在绘制 1000 个立方体/球体,执行 1000 个 glTranslatef()s。活动监视器显示 20% 的 CPU 使用率。随着 glTranslatef() 被注释掉(我仍然绘制所有对象,但都在一个地方)CPU 使用率下降到 12%。对我来说似乎很重要。我什至还没有实现任何效果和动画。现在仍在使用渲染对象的幼稚实现,但我猜使用 VBO 或 DisplayLists 不会使 glTranslatef() 更快。
-
当然我在这里可能完全错了,但我仍然想知道更大的游戏如何处理这些东西。
-
@cargath:这些图块是每一帧都在世界空间中移动,还是静止不动?
-
@genpfault:我的一些对象是动画的,所以我必须每帧重绘世界。
标签: performance opengl vbo displaylist