Performance 游戏环境中的OpenGL VBO/DisplayList 我正在做一个小游戏(使用OS X狮子,XCODER 4,Objul-C/C++,COCOA,OpenGL)。这是一个相当简单的概念。我有一些物体在二维数组中移动。现在我想为我的游戏编写一个OpenGL GUI

Performance 游戏环境中的OpenGL VBO/DisplayList 我正在做一个小游戏(使用OS X狮子,XCODER 4,Objul-C/C++,COCOA,OpenGL)。这是一个相当简单的概念。我有一些物体在二维数组中移动。现在我想为我的游戏编写一个OpenGL GUI,performance,opengl,vbo,displaylist,Performance,Opengl,Vbo,Displaylist,我所做的是遍历我的数组,在它的特定位置为每个对象绘制一个立方体,纹理取决于对象的种类。当然,我的第一个天真的实现有点CPU密集,所以下一步是实现纹理图谱。因为我有很多顶点,所以还有很多改进的空间 我读到VBO和显示列表要快得多。我已经完成了一些教程,但是对于在真实的动态游戏环境中的实现,我仍然有很多疑问 假设我为我的游戏对象编译了一些显示列表。如果要将其放置在特定位置,则必须使用glTranslatef()。但是很多glTranslatef()都可能非常占用CPU。我该怎么处理呢?当然,我可以在

我所做的是遍历我的数组,在它的特定位置为每个对象绘制一个立方体,纹理取决于对象的种类。当然,我的第一个天真的实现有点CPU密集,所以下一步是实现纹理图谱。因为我有很多顶点,所以还有很多改进的空间

我读到VBO和显示列表要快得多。我已经完成了一些教程,但是对于在真实的动态游戏环境中的实现,我仍然有很多疑问

假设我为我的游戏对象编译了一些显示列表。如果要将其放置在特定位置,则必须使用glTranslatef()。但是很多glTranslatef()都可能非常占用CPU。我该怎么处理呢?当然,我可以在每个可能的位置为每种游戏对象创建一个显示列表,但这似乎不切实际,而且它只能工作,因为我的游戏是基于瓷砖的


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

显示列表和VBO通常对琐碎的几何体没有帮助。有时,如果我正确地回忆起蓝色OpenGL手册,他们甚至可以减慢速度

显示列表在OpenGL 1.x中是“最好的”,但随着VBOs的引入,它被认为是遗留功能

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

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

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

也就是说,用VBOs重新设计它并在属性中提供转换可能需要大量的工作才能获得8%的CPU使用率。可能是2.0ghz core 2 duo的一个核心上的8%

编辑


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

显示列表和VBO通常对琐碎的几何图形没有帮助。有时,如果我正确地回忆起蓝色OpenGL手册,他们甚至可以减慢速度

显示列表在OpenGL 1.x中是“最好的”,但随着VBOs的引入,它被认为是遗留功能

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

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

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

也就是说,用VBOs重新设计它并在属性中提供转换可能需要大量的工作才能获得8%的CPU使用率。可能是2.0ghz core 2 duo的一个核心上的8%

编辑


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

“但是很多glTranslatef()可能会占用大量的CPU。”那么呢?你说你在做“小游戏”。你有理由相信几次矩阵乘法会显著降低游戏的性能吗?除非你有成百上千的对象,否则这真的不重要。这个问题带有过早优化的味道。不要沉迷于“OMGFASTER!!!!11”,只要让它工作起来;你会惊讶地发现,显而易见的解决方案往往足够快。我有25*40瓷砖大小的关卡,大约1000个物体。我画了1000个立方体/球体,做了1000个glTranslatef()s。活动监视器显示20%的CPU使用率。注释掉glTranslatef()后(我仍然绘制所有对象,但都在一个点上),CPU使用率下降到12%。对我来说似乎很重要。我甚至还没有实现任何效果和动画。仍然在使用渲染对象的朴素实现吗