android opengl 2.0动态壁纸落后

时间:2014-10-14 17:15:57

标签: android opengl-es opengl-es-2.0

我正在为Android开发一个OpenGL 2.0动态壁纸,并且渲染是滞后的(~11fps)。我绝不是专家,但我找不到任何在线资源来回答我的问题。基准测试,我发现'onDrawFrame(GL10 glUnused)'由于我使用了多少个对象而失速。如果我将它限制为渲染~100个对象,我得到一个OK帧率,但我的壁纸包含~1000个三角形的栅格。这是问题吗?这是代码:

public void onDrawFrame(GL10 glUnused) {

    if (para.xOffset > f) {
        Matrix.translateM(mViewMatrix, 0, (para.xOffset - f) * 10, 0, 0);
        f = para.xOffset;
    } else {
        Matrix.translateM(mViewMatrix, 0, (para.xOffset - f) * 10, 0, 0);
        f = para.xOffset;
    }

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

    GLES20.glUseProgram(mPerVertexProgramHandle);

    mMVPMatrixHandle = GLES20.glGetUniformLocation(mPerVertexProgramHandle,
            "u_MVPMatrix");
    mMVMatrixHandle = GLES20.glGetUniformLocation(mPerVertexProgramHandle,
            "u_MVMatrix");
    mLightPosHandle = GLES20.glGetUniformLocation(mPerVertexProgramHandle,
            "u_LightPos");
    mPositionHandle = GLES20.glGetAttribLocation(mPerVertexProgramHandle,
            "a_Position");
    mColorHandle = GLES20.glGetAttribLocation(mPerVertexProgramHandle,
            "a_Color");
    mNormalHandle = GLES20.glGetAttribLocation(mPerVertexProgramHandle,
            "a_Normal");

    Matrix.setIdentityM(mLightModelMatrix, 0);
    Matrix.translateM(mLightModelMatrix, 0, 0.0f, 0.0f, -5.0f);
    Matrix.translateM(mLightModelMatrix, 0, 0.0f, 0.0f, 2.0f);

    Matrix.multiplyMV(mLightPosInWorldSpace, 0, mLightModelMatrix, 0,
            mLightPosInModelSpace, 0);

    for (newHexagon nha[] : h.hfgrd) {
        for (newHexagon nh : nha) {

            Matrix.setIdentityM(mModelMatrix, 0);
            Matrix.translateM(mModelMatrix, 0, nh.PosX, nh.PosY, -5);

            final FloatBuffer colors;
            colors = ByteBuffer
                    .allocateDirect(nh.colors.length * mBytesPerFloat)
                    .order(ByteOrder.nativeOrder()).asFloatBuffer();
            colors.put(nh.colors).position(0);

            drawthis(colors);
        }

    }

    GLES20.glUseProgram(mPointProgramHandle);

    h.draw(0, 0);
}    

编辑:附加信息:三角形是不均匀的,并排列在屏幕的平面六边形平铺中。

CPU:双核1.2 GHz Scorpion

GPU:Adreno 220

设备:HTC Sensation

Android v4.0.3

1 个答案:

答案 0 :(得分:0)

您的代码中至少存在3个主要问题:

  1. 不要在每个帧上调用glGetUniformLocation - 在着色器编译后将它们分配给字段一次。获得制服/属性是一项相当昂贵的操作。
  2. 您可能会生成过多的绘制调用(glDrawElementsglDrawArrays)。您的drawthis()方法应该至少发出一次绘制调用。现代硬件可以处理最大200-500绘图调用。每个绘制调用都具有驱动程序到GPU通信的小开销,因此最佳做法是尽可能多地批量绘制多个绘制调用。但请提供drawthis()的代码以便更好地理解问题。
  3. 每次抽奖都
  4. ByteBuffer.allocateDirect()。你必须避免任何内存分配,而你是在循环中进行。