某些设备上使用OpenGL ES 2.0的Android绘图纹理速度较慢

时间:2014-03-05 10:19:51

标签: android textures opengl-es-2.0 textureview

在我的Android 4.3应用程序中,我想将纹理从本地png加载到TextureView上。我不知道OpenGL,我正在使用GLTextureActivity硬件加速测试中的代码。我在这里粘贴加载纹理部分:

    private int loadTexture(int resource) {
        int[] textures = new int[1];

        glActiveTexture(GL_TEXTURE0);
        glGenTextures(1, textures, 0);
        checkGlError();

        int texture = textures[0];
        glBindTexture(GL_TEXTURE_2D, texture);
        checkGlError();

        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

        Bitmap bitmap = BitmapFactory.decodeResource(mResources, resource);

        GLUtils.texImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bitmap, GL_UNSIGNED_BYTE, 0);
        checkGlError();

        bitmap.recycle();

        return texture;
    }

我在两个设备中运行代码: Nexus 7 和Galaxy Nexus手机,我注意到两者之间存在巨大的速度差异。对于 Nexus 7 ,绘图部分大约需要170毫秒,但对于 Galaxy Nexus ,它需要459毫秒。最耗时的操作是加载纹理,尤其是texImage2D调用。我已经读过,有些设备的芯片在texImage2D - texSubImage2D函数上运行缓慢,但有人怎么能分辨出这些设备是什么?我怎样才能避免使用这些函数来实现相同的结果呢? / p>

提前谢谢。

//编辑:glDrawArrays(GL_TRIANGLE_STRIP, 0, 4)电话似乎也明显慢于手机设备。为什么会这样?我怎么能避免它?

1 个答案:

答案 0 :(得分:1)

您是否在每个帧重绘时加载纹理?那是不对的 - 你应该在主渲染循环之前只加载一次纹理。即使在最快的设备上也不会加载即时纹理 - 加载资源,从中解码位图然后将其加载到GPU。这需要一些时间。