Iphone 优化opengles应用程序。如果可能的话,我应该避免打电话给glVertexPointer吗?

Iphone 优化opengles应用程序。如果可能的话,我应该避免打电话给glVertexPointer吗?,iphone,optimization,opengl-es,Iphone,Optimization,Opengl Es,我正在用OpenGLES1.1为iPhone开发一个游戏;我在数据结构中有很多纹理四边形,其中每个节点都有一个子节点列表。因此,我从根遍历结构,然后渲染每个四边形,然后是其子对象,依此类推 问题是,对于每个四边形,我调用glVertexPointer来设置顶点 我是否应该避免为每个四边形调用它?例如,只需调用一次就可以提高性能吗 glVertexPointer将顶点复制到GPU内存,还是只保存指针 尝试最小化调用数量并不容易,因为每个节点可能有不同的四元组。我有很多具有相同顶点数据的相同精灵

我正在用OpenGLES1.1为iPhone开发一个游戏;我在数据结构中有很多纹理四边形,其中每个节点都有一个子节点列表。因此,我从根遍历结构,然后渲染每个四边形,然后是其子对象,依此类推

问题是,对于每个四边形,我调用glVertexPointer来设置顶点

  • 我是否应该避免为每个四边形调用它?例如,只需调用一次就可以提高性能吗
  • glVertexPointer将顶点复制到GPU内存,还是只保存指针
尝试最小化调用数量并不容易,因为每个节点可能有不同的四元组。我有很多具有相同顶点数据的相同精灵,但我不一定一个接一个地渲染,因为我可能在它们之间绘制不同的精灵


谢谢。

GLVERTExpinter只保留指针,但会导致OpenGL驱动程序的状态更改和显式同步,因此成本相当高。通常,当你说“这是我的数据,请绘制”时,GPU会开始绘制,并尽可能长时间地与CPU上正在发生的任何事情并行地继续绘制。当您更改渲染状态时,它需要完成在旧状态下执行的任何操作。因此,通过每四个四元组更改一次,可以有效地强制并行处理是连续的。因此,避免每个四元组使用glVertexPointer(可能还有GLDrawArray或glDrawElements?)应该会给您带来显著的好处

一个直接的优化方法就是保持数据结构中四边形总数的计数,为至少达到该大小的顶点分配单个目标缓冲区,并让所有四边形将其几何图形复制到目标缓冲区中,而不是每次调用glVertexPointer。然后调用glVertexPointer和绘图调用(希望也能压缩为一个调用),最后使用一个大数组。CPU方面的成本有点高,但是并行性和缺少重复的GPU/CPU同步应该可以为您节省很多

虽然在目前保密协议下的话题上三缄其口,但我强烈建议您看看Xcode 4测试版。苹果的其他功能包括OpenGL ES分析器。因此,您可以轻松地比较各种方法

要将数据复制到GPU,需要使用顶点缓冲区对象。这意味着使用
glGenBuffers
创建一个缓冲区,使用
glBufferData
将数据推送到缓冲区,然后发布一个地址为0的glvertexinter,如果上载数据中的第一个字节是顶点的第一个字节。在ES 1.x中,您可以将数据上传为
GL\u DYNAMIC\u DRAW
,以标记您打算经常更新数据并经常从中提取数据。如果你能进入一个你画画的频率比上传的频率更高的位置,这可能是值得做的

如果您切换到ES 2.x,还有
GL\u STREAM\u DRAW
,这可能值得调查,但与您的问题没有直接关系。我提到它,因为如果你在桌面OpenGL上搜索顶点缓冲区对象,它可能会出现。ES 1.x的选项只有
GL\u STATIC\u DRAW
和GL\u DYNAMIC\u DRAW


我最近刚刚开发了一个iPadES1.x应用程序,其中的对象每帧都会更改,但在使用的渲染管道中会绘制两次。屏幕上只有五个这样的对象,每个都有40个顶点,但是从初始实现切换到VBO实现可以减少20%的总处理时间。

疑问:要将所有四边形放在一个数组中,然后只调用一次glVertexPointer,我应该添加退化三角形,对吗?退化三角形允许您链接在绘制为GL_三角形_带时未以其他方式连接的多边形带。如果你只是使用GL_三角形,那么它们是不必要的。如果你画了很多断开连接的四边形,那么我认为没有充分的理由推荐其中任何一个;您仍然需要为每个四边形提供六个索引或顶点,并且您的卡理论上为条带中的共享边设置时可能保存的任何内容(如果有的话;我不知道公共硬件在实践中是否会这样做)可能在为不可见四边形设置时丢失。很好,现在我将所有顶点复制到一个公共数组中,然后再将它们发送到opengl,尽管我每帧复制所有对象,但游戏的fps提高了2倍多!渲染所花费的时间从每帧16毫秒增加到4毫秒。谢谢!我用的是GL_三角形。