VBOs在真实硬件(LG Optimus V 670) - Android 2.2.1上非常慢



我正在为我的android游戏制作一个2d OpenGL图形引擎,到目前为止,我已经通过VBOs实现了基本的非纹理四边形渲染。

为了做到这一点,我的图形引擎在初始化和渲染时创建了一个四边形的VBO使用Polygon2D对象指定的位置/尺寸绘制。

在实际硬件(LG Optimus V 670)上渲染30 - 50四帧时,帧率约为5 - 10,在模拟器上为30 - 40。

下面的代码可以让你更好地理解
public void CreateBuffers(GL10 gl)
{
    GL11 gl11 = (GL11)gl;
    mQuadBuffer = ByteBuffer.allocateDirect(QUAD2D.length * 4).order(ByteOrder.nativeOrder()).asFloatBuffer();
    mQuadBuffer.put(QUAD2D, 0, QUAD2D.length);

    mQuadBuffer.flip();
    int[] buffer = new int[1];
    gl11.glGenBuffers(1, buffer, 0);
    mQuadVBOId = buffer[0];
    gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, mQuadVBOId);
    gl11.glBufferData(GL11.GL_ARRAY_BUFFER, mQuadBuffer.capacity() * 4, mQuadBuffer, GL11.GL_DYNAMIC_DRAW);
}

public void draw(GL10 gl) {
    GL11 gl11 = (GL11)gl;
    Polygon2D poly;
    int length = mPolygons.size();
    gl.glEnableClientState(GL11.GL_VERTEX_ARRAY);
    gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, mQuadVBOId);
    gl11.glVertexPointer(2, GL11.GL_FLOAT, 0, 0);
    for(int i = 0; i < length; i++)
    {
        poly = mPolygons.get(i);
        gl11.glPushMatrix();
        gl11.glTranslatef(poly.x, poly.y, 0);
        gl11.glScalef(poly.width, poly.height, 0);
        gl11.glDrawArrays(GL11.GL_LINE_LOOP, 0, 4);
        gl11.glPopMatrix(); 
    }
    gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, 0);
    gl.glDisableClientState(GL11.GL_VERTEX_ARRAY);
}

我做错了什么,其他OpenGl应用程序似乎运行良好,如Replica Island。

我怀疑这是有用的,但这里是规范http://pdadb.net/index.php?m=specs&id=2746&c=lg_vm670_optimus_v

VBO并不慢,但是许多单独的draw调用很慢。你应该将所有的四边形组合在一个VBO中(即计算每个四边形的顶点位置),并使用一次调用来绘制它。为了能够做到这一点,您还必须从使用GL_LINE_LOOP更改为GL_LINES以获得四元之间的分离。

最新更新