使用 OpenGL ES 2.0 的 Android 绘图纹理在某些设备上运行缓慢

标签 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 函数上运行速度很慢,但是有人怎么知道哪些是这些设备以及我如何避免使用这些函数来达到同样的结果?

提前谢谢你。

//编辑:glDrawArrays(GL_TRIANGLE_STRIP, 0, 4) 调用在电话设备中似乎也明显变慢。为什么会这样?我该如何避免呢?

最佳答案

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

关于使用 OpenGL ES 2.0 的 Android 绘图纹理在某些设备上运行缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22194841/

相关文章:

java - 如何解析Sub JSONArray并显示图像?

android - Box.com Android 库 v2 redirect_uri?

node.js - 服务器上的 Three.js 和 Node.js - 如何加载纹理?

iOS Cocos3D 在initializeScene方法之外添加.pod文件

android - 在没有物理手机的情况下测试android opengl es 2.0,有什么办法吗?

android - 我在 Android Studio 中的第一个程序(Hello world)

android - 图像和视频过滤器,如 android 中的 snapchat

c++ - 如何减少图像/纹理中的 "flickering"薄元素?

c++ - 如何加载纹理Opengl?

Android EGL/OpenGL ES 帧速率卡顿