2

在我的 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功能但是有人怎么知道这些设备是哪些设备,我如何避免使用这些功能来达到相同的结果?

先感谢您。

// 编辑:glDrawArrays(GL_TRIANGLE_STRIP, 0, 4)电话设备中的通话似乎也明显变慢。为什么会这样?我怎么能避免呢?

4

1 回答 1

1

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

于 2014-03-05T15:33:36.157 回答