【问题标题】:android opengl 2.0 live wallpaper laggingandroid opengl 2.0 动态壁纸滞后
【发布时间】:2014-10-16 15:41:04
【问题描述】:

我正在为 android 开发 OpenGL 2.0 动态壁纸,但渲染速度很慢 (~11fps)。我绝不是专家,但我找不到任何在线资源来回答我的问题。基准测试,我发现'onDrawFrame(GL10 glUnused)' 因为我使用了多少对象而停止。如果我将其限制为渲染约 100 个对象,我会得到一个好的帧速率,但我的壁纸由约 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:肾上腺皮质激素 220

设备:HTC Sensation

Android v4.0.3

【问题讨论】:

  • 什么 CPU、GPU 和设备?

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-01
    • 1970-01-01
    相关资源
    最近更新 更多