在Android上使用OpenGL的低FPS

时间:2011-12-09 23:59:41

标签: android opengl-es

我联系是因为,我尝试使用openGL与android,以制作2D游戏:)

这是我的工作方式:

我有一个班级GlRender

public class GlRenderer implements Renderer

在这个类中,我在onDrawFrame上 GameRender()GameDisplay()

gameDisplay()我有:

gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
            // Reset the Modelview Matrix
            gl.glMatrixMode(GL10.GL_PROJECTION);    //Select The Modelview Matrix
            gl.glLoadIdentity();                    //Reset The Modelview Matrix


            // Point to our buffers
            gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
            gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

            // Set the face rotation
            gl.glFrontFace(GL10.GL_CW);

            for(Sprites...)
            {
                sprite.draw(gl, att.getX(), att.getY());
            }
            //Disable the client state before leaving
            gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
            gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

在sprite的draw方法中我有:

    _vertices[0] = x;
    _vertices[1] = y;

    _vertices[3] = x;
    _vertices[4] = y + height;

    _vertices[6] = x + width;
    _vertices[7] = y;   

    _vertices[9] = x + width;
    _vertices[10] = y + height; 


    if(vertexBuffer != null)
    {
        vertexBuffer.clear();
    }
    // fill the vertexBuffer with the vertices
    vertexBuffer.put(_vertices);
    // set the cursor position to the beginning of the buffer
    vertexBuffer.position(0);


    // bind the previously generated texture
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);

    // Point to our vertex buffer
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer.mByteBuffer);
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer.mByteBuffer);

    // Draw the vertices as triangle strip
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, _vertices.length / 3);

我的问题是我的帧速率很低,即使在30 FPS时,有时只有1个精灵会丢失一些帧(但它与50相同)

我做错了吗?我怎样才能提高FPS?

1 个答案:

答案 0 :(得分:1)

通常,您不应该为每个绘制的精灵更改顶点缓冲区。除非你正在制作一个粒子系统,否则“通常”,我的意思是“从不”。即使这样,你也会使用正确的流媒体技术,而不是一次写一个四元组。

对于每个精灵,你都有一个预制的四边形。要渲染它,可以使用着色器uniform将精灵从中性位置转换为想要在屏幕上看到它的实际位置。