Android openGL试图通过对多个网格使用相同的顶点来增加FPS

Android openGL试图通过对多个网格使用相同的顶点来增加FPS,android,opengl-es,Android,Opengl Es,我正在开发一个游戏,类似的物体在屏幕上呈现。问题是,每次添加新对象时,都需要处理更多的顶点,因此FPS会减少 由于我是openGl的初学者,我对提高性能有一些一般性的想法,我只是不知道openGl允许我做什么 由于我的大多数对象都是相同的(相同数量的顶点、相同的颜色、相同的UV和相同的法线),但只有对象的位置和旋转不同,所以在每个帧渲染时,是否可以只发送一次类似对象的顶点,然后调用所有对象的抽屉元素并只修改对象的位置 是否可以更进一步,只在第一次创建场景时上载一次这些相似的顶点,并且在每个帧渲染

我正在开发一个游戏,类似的物体在屏幕上呈现。问题是,每次添加新对象时,都需要处理更多的顶点,因此FPS会减少

由于我是openGl的初学者,我对提高性能有一些一般性的想法,我只是不知道openGl允许我做什么

  • 由于我的大多数对象都是相同的(相同数量的顶点、相同的颜色、相同的UV和相同的法线),但只有对象的位置和旋转不同,所以在每个帧渲染时,是否可以只发送一次类似对象的顶点,然后调用所有对象的抽屉元素并只修改对象的位置

  • 是否可以更进一步,只在第一次创建场景时上载一次这些相似的顶点,并且在每个帧渲染时只为每个对象调用抽屉元素

  • 目前,我正在发送每个对象的顶点,如下所示:

    .......
    gl.glNormalPointer(GL10.GL_FLOAT, 0, normals);
    gl.glColorPointer(4, GL10.GL_UNSIGNED_BYTE, 0, colors);
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertices);
    gl.glPushMatrix();
    gl.glTranslatef(position);
    gl.glRotatef(rotation);
    gl.glScalef(scale);    
    gl.glDrawElements(renderType,nr,GL10.GL_UNSIGNED_SHORT, faces);
    gl.glPopMatrix();
    ........
    
    .......
    gl.glNormalPointer(GL10.GL_FLOAT, 0, normals);
    gl.glColorPointer(4, GL10.GL_UNSIGNED_BYTE, 0, colors);
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertices);
    for(eachObject)
    {
    gl.glPushMatrix();
    gl.glTranslatef(position);
    gl.glRotatef(rotation);
    gl.glScalef(scale);
    gl.glDrawElements(renderType,nr,GL10.GL_UNSIGNED_SHORT, faces);
    gl.glPopMatrix();
    ........
    }
    
    我想我应该这样做:

    .......
    gl.glNormalPointer(GL10.GL_FLOAT, 0, normals);
    gl.glColorPointer(4, GL10.GL_UNSIGNED_BYTE, 0, colors);
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertices);
    gl.glPushMatrix();
    gl.glTranslatef(position);
    gl.glRotatef(rotation);
    gl.glScalef(scale);    
    gl.glDrawElements(renderType,nr,GL10.GL_UNSIGNED_SHORT, faces);
    gl.glPopMatrix();
    ........
    
    .......
    gl.glNormalPointer(GL10.GL_FLOAT, 0, normals);
    gl.glColorPointer(4, GL10.GL_UNSIGNED_BYTE, 0, colors);
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertices);
    for(eachObject)
    {
    gl.glPushMatrix();
    gl.glTranslatef(position);
    gl.glRotatef(rotation);
    gl.glScalef(scale);
    gl.glDrawElements(renderType,nr,GL10.GL_UNSIGNED_SHORT, faces);
    gl.glPopMatrix();
    ........
    }
    
  • 是的(甚至更好)
  • 您的第二个代码示例看起来与您应该做的完全相同


    没有理由需要多次上传顶点,在初始化时这样做就足够了。之后,只要在任何时候设置指针就可以了。您可以通过不同的平移/旋转调用GLDrawerElements任意多次。

    但我还是不明白。在每个帧渲染上设置顶点渲染器,并不意味着每次都会将这些顶点上载到GPU?如果你说2是可能的,我真的不知道怎么做。调用*指针函数不会上传任何数据,它只是告诉OpenGL数据存在的位置。您可以通过两种方式使用指针:1)作为顶点数组,其中顶点在每次绘制元素调用时流式传输到GPU(您不希望这样)。或2)作为顶点缓冲区对象(VBO),在初始化时在GPU上创建顶点缓冲区,并用*指针指向它。然后,当调用draw元素时,数据将从GPU内存中加载。不管怎样,读这篇文章,它会帮助你理解@Mihaisiata你的回答帮助我了解了我的选择。VBO似乎没有在Android 2.2上工作(因为他们的Android框架中存在一些bug)。另一种选择是使用libgdx。但现在我将为2.2实现第1点,而对于2.3及更高版本,我也将使用VBOs(第2点)。谢谢你的帮助。