在Nexus 10 / Android 4.2.2上降低glTexSubImage2D性能(三星Exynos 5 w / Mali-T604)

我有一个 Android应用程序,将视频解码为yuv420p格式,然后使用OpenGLES呈现视频帧.
我使用glTexSubImage2D()将y / u / v缓冲区上传到GPU,然后使用着色器进行YUV2RGB转换.所有EGL / OpenGL设置/呈现代码都是本机代码.

现在我并不是说我的代码没有问题,但考虑到相同的代码在iOS(iPad / iPhone),Nexus 7,Kindle HD 8.9,Samsung Note 1和其他一些廉价的中国平板电脑上运行完美(A31 / RockChip 3188)运行Android 4.0 / 4.1 / 4.2.我会说我的代码不太可能出错.在这些设备上,glTexSubImage2D()使用不到16ms的时间来上传SD或720P高清纹理.

然而,在Nexus 10上,glTexSubImage2D()对于SD或720P高清纹理大约需要50~90ms,这对于30fps或60fps的视频来说太慢了.

我想知道

1)如果我应该选择不同的纹理格式(RGBA或BGRA).有没有办法检测哪个是GPU使用的最佳纹理格式?

2)如果在所有其他SOC上有一个“OFF”功能,但在Exynos 5上设置为“ON”.例如,自动MIPMAP生成选项. (我把它关了,顺便说一句)

3)如果这是三星Exynos SOC的已知问题 – 我找不到Exynos CPU的支持论坛

4)配置EGL表面时是否需要设置任何选项?喜欢,透明度,表面格式等? (我不知道我在说什么)

5)这可能意味着GPU正在进行隐式格式转换,但我检查了GL_LUMINANCE总是被使用.它再次适用于所有其他平台.

6)其他什么?

我的EGL配置:

const EGLint attribs[] = {
    EGL_SURFACE_TYPE,EGL_WINDOW_BIT,EGL_RENDERABLE_TYPE,EGL_OPENGL_ES2_BIT,EGL_BLUE_SIZE,8,EGL_GREEN_SIZE,EGL_RED_SIZE,EGL_NONE
};

初始设置:

glTexImage2D(GL_TEXTURE_2D,GL_LUMINANCE,ctx->frameW,ctx->frameH,GL_UNSIGNED_BYTE,NULL); /* also for U/V  */

后续部分替换:

glTexSubImage2D(GL_TEXTURE_2D,yBuffer); /*also for U/V */

我试图在SD或720P HD分辨率下以~30FPS或~60FPS渲染视频.

解决方法

这是我们向ARM报告的已知驱动程序问题.未来的更新应该修复它.

以上是来客网为你收集整理的在Nexus 10 / Android 4.2.2上降低glTexSubImage2D性能(三星Exynos 5 w / Mali-T604)全部内容,希望文章能够帮你解决在Nexus 10 / Android 4.2.2上降低glTexSubImage2D性能(三星Exynos 5 w / Mali-T604)所遇到的程序开发问题。

如果觉得来客网网站内容还不错,欢迎将来客网网站推荐给程序员好友。