我正在开发一个小游戏(使用OS X Lion,Xcode4,Objective-C / C++,Cocoa,OpenGL)。这是一个相当简单的概念。我有一些在二维数组中移动的对象。现在我想为我的游戏编写一个OpenGL图形用户界面。
我所做的是遍历我的数组,并为其中的每个对象绘制一个立方体,在它的特定位置,具有依赖于对象类型的纹理。当然,我的第一个简单实现有点占用CPU,所以下一步是实现一个纹理图集。因为我有很多顶点,所以还有很大的改进空间。
我读到VBO和DisplayLists要快得多。我完成了一些教程,但我仍然有很多关于在真正的动态游戏环境中实现的问题。
假设我为我的游戏对象编译了一些显示列表。如果我想把它放在一个特定的位置,我必须使用glTranslatef()。但是很多glTranslatef()可能非常占用CPU。我该怎么处理呢?当然,我可以在每个可能的位置为每种游戏对象创建一个显示列表,但这似乎不切实际,而且它只会起作用,因为我的游戏是基于磁贴的……
VBO似乎也有同样的问题。当然(至少从我的理解),我可以创建一个完整的顶点网格,然后遍历我的数组,为每个对象渲染一个与对象位置相关联的顶点立方体。但我不明白如何将纹理应用于整个顶点网格中的特定立方体。我是否必须为网格内的每个立方体表面创建纹理坐标,或者为一个立方体的所有6个面创建纹理坐标就足够了吗?
发布于 2011-11-05 05:07:14
显示列表和VBO通常对琐碎的几何图形没有帮助。如果我没记错的话,有时他们甚至可以放慢速度。如果我没记错的话,那就是蓝色的OpenGL。
显示列表在OpenGL 1.x中是“尽善尽美”的,但随着VBO的引入,显示列表被认为是遗留功能。
如果我们知道您的OpenGL目标版本会有所帮助。在使用即时模式的OpenGL 1.x中,你要做的就是设置你的“相机矩阵”( OpenGL没有,你只是把它的转置留在矩阵堆栈上),然后在你的渲染循环中为每个模型推送和弹出矩阵。
使用OpenGL 2.x或1.xARB扩展,您可以将变换放在统一矩阵中,然后为每个模型更新统一。这不会给你带来多少好处,因为更新制服的速度也很慢。
我认为最好的做法是在着色器中为OpenGL提供(一组)属性矩阵。这将通过一次性传输所有数据来减少CPU开销。我想不出技术实现的细节,但我认为属性是每个顶点的,所以您必须传递一个索引,指示在用于放置转换的另一个缓冲区中查找的位置。我从来没有这样做过,因为大多数模型包含的几何和纹理信息比设置变换的时间还多。
也就是说,使用VBO重新设计它并在属性中提供转换可能是一项巨大的工作,CPU使用率提高了8%。可能是2.0 duo酷睿2双核处理器的一个内核上的8%
编辑
统一缓冲区对象才是我真正想要的。可能是为了一个统一的区块布局。蓝皮书(也许还有橙色书)和谷歌有更多的细节。
https://stackoverflow.com/questions/8003007
复制相似问题