1

最初我在 2d 实时动作类型游戏中使用画布绘制位图,但由于某种原因,我的帧速率很糟糕。我怀疑它是画布,所以我切换到opengl。通过网上冲浪,我学会了从 2 个三角形创建一个矩形并在其上设置纹理。我使用 glOrthof 设置它的 2d 透视图并使用 gltranslatef 方法移动我的纹理。我知道问题不在于物理或任何东西,因为我测试了以恒定速度移动单个纹理(x 值以每 33 毫秒约 7 个单位移动)。它仍然波涛汹涌。我将 fps 设置为 30。这是我的游戏循环:

public void onDrawFrame(GL10 gl) {

    startTime = System.nanoTime();

    gl.glClearColor(0f, .0f, .8f, 0.5f);

    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

    g.updatePhysics();
    onDraw(gl);

    sleepTime = (int) (TICKS_INTERVAL - (System.nanoTime() - startTime)/1000000);

    if(sleepTime > 0){
        try{
            Thread.sleep(sleepTime);
        }catch(Exception e){}
    }
}

这就是它们的绘制方式:

public void onDraw(GL10 gl){

    gl.glLoadIdentity();

    if(g.state == g.STATE_GAME){

        gl.glTranslatef(x, y, z);
        rectangle.draw(gl);

        gl.glLoadIdentity();
        gl.glTranslatef(x, y, z);
        rectangle2.draw()gl;
    }
}

这是矩形内的绘制方法:

public void draw(GL10 gl){
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);

    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

    gl.glFrontFace(GL10.GL_CW); 

    gl.glEnable(GL10.GL_BLEND);
    gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA);

    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertBuff);
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuff);

    gl.glDrawElements(GL10.GL_TRIANGLES, pIndex.length, GL10.GL_UNSIGNED_SHORT, pBuff);// Draw the vertices as triangle strip
    //gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, vertices.length / 3);

    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
}

即使当我将帧速率设置为 60 时,仍然会有一些卡顿,这令人沮丧,因为在过去的一个月里,我一直在努力让帧速率平滑。我正在 Galaxy s2 上进行测试,所以我知道它不是硬件。如果所有这些代码都是正确的,您认为它可能是活动中的其他内容吗?我的 GLSurfaceView 实际上是一个自定义视图。即使让单个纹理以恒定速度平滑移动也会很好。

4

0 回答 0