Android:性能问题多个纹理 Opengl ES

Android: performance issue multiple textures Opengl ES

我在 android 制作的游戏基于 canvas,出于性能原因,我将把这款游戏提升到 OpenGL ES。

问题仍然是性能 - 我有一个背景和一个在屏幕上跳动的精灵 - 这工作得很好,但它似乎是与使用 Canvas 相同的性能问题。有时精灵动画不是很流畅。我想我的设计很糟糕或者真的很糟糕。

每一帧都调用texImage2D是不是错了?有什么替代方案?

谢谢!!!

 @Override
public void onDrawFrame(GL10 unused) {

    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);

    long speedFactor = 5000;
    long time = SystemClock.uptimeMillis() % speedFactor;
    float angleInDegrees = (360.0f / speedFactor) * ((int) time);

    GLES20.glUseProgram(mProgramHandle);

    mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgramHandle, "u_MVPMatrix");
    mMVMatrixHandle = GLES20.glGetUniformLocation(mProgramHandle, "u_MVMatrix");
    mColorHandle = GLES20.glGetAttribLocation(mProgramHandle, "a_Color");
    mNormalHandle = GLES20.glGetAttribLocation(mProgramHandle, "a_Normal");
    mTextureCoordinateHandle = GLES20.glGetAttribLocation(mProgramHandle, "a_TexCoordinate");

    GLES20.glEnable(GLES20.GL_BLEND);
    GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ONE_MINUS_SRC_ALPHA);


    //BACKGROUND
    GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, background, 0);
    //GLUtils.texSubImage2D(GLES20.GL_TEXTURE_2D, 0, 0, 0, background);
    Matrix.setIdentityM(mModelMatrix, 0);
    Matrix.translateM(mModelMatrix, 0, 0, 0.0f, -2.00001f);
    drawTriangle(mCubePositions);



    // THE MOVING SPRITE.
    int rest = 0;
    if (modulo > 0) {
        rest = frameCntr % modulo;
    }

    GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, alien[bitmapIndex], 0);
    //GLUtils.texSubImage2D(GLES20.GL_TEXTURE_2D, 0, 0, 0, alien[bitmapIndex]);
    if (rest == 0) {
        bitmapIndex++;
    }

    if (bitmapIndex == alien.length) {
        bitmapIndex = 0;
    }

    frameCntr++;

    float deltaX = (motion.get_velocityX() * motion.get_xDirection());
    float deltaY = (motion.get_velocityY() * motion.get_yDirection());
    anim_x += deltaX;
    anim_y += deltaY;

    Matrix.setIdentityM(mModelMatrix, 0);
    Matrix.translateM(mModelMatrix, 0, anim_x, anim_y, -7f);
    //Matrix.rotateM(mModelMatrix, 0, angleInDegrees, 0.0f, 1.0f, 0.0f);
    drawTriangle(mAlienPositions);
    calcPos();
    collision.collisionWalls(motion, xPos, yPos, game_width, game_height);
}

实际上,GLUtils.texImage2D() 调用了 glTexImage2D()

glTexImage2D(),另一方面用于加载位图。您只需调用一次即可加载纹理。它将位图加载到当前绑定的纹理中。

在绘图调用中,您应该通过调用 GLES20.glBindTexture( target, texture ) 绑定到所需的纹理。 targetGL_TEXTURE_2DGL_TEXTURE_CUBE_MAPtexture 是在调用 GLUtils.texImage2D().

之前绑定的纹理名称

此外,不要忘记在每次绘制调用和初始化后使用 GLES20.glBindTexture( target, 0 ) 取消绑定当前纹理。