我有一个安卓应用程序,解码成yuv420p格式的视频,然后使用OpenGLES渲染视频帧。我使用glTexSubImage2D()将y/u/v缓冲区上传到图形处理器,然后使用着色器进行YUV2RGB转换。所有EGL/OpenGL设置/渲染代码都是本机代码。
现在我不是说我的代码没有问题,但考虑到同样的代码在iOS (iPad/iPhone),Nexus7,Kindle HD8.9,Samsung Note 1和其他一些运行安卓4.0/4.1/4.2的廉价中国平板电脑(A31/RockChip 3188)上运行得很好。我会说,我的代码出错的可能性较小。在这些设备上,glTexSubImage2D()上传SD或720P HD纹理所用的时间不到16ms。
然而,在Nexus10上,对于标清或720P高清纹理,glTexSubImage2D()大约需要50~90ms,这对于30fps或60fps的视频来说太慢了。
我想知道
1)如果我应该选择不同的纹理格式(RGBA或BGRA)。有没有办法检测GPU使用的最好的纹理格式?
2)如果有一个功能在所有其他SOC上都是'OFF‘,但在Exynos 5上设置为' on’。例如,自动MIPMAP生成选项。(顺便说一句,我把它关掉了)
3)如果这是Samsung Exynos SOC的已知问题-我找不到Exynos CPU的支持论坛
4)配置EGL表面时有什么需要设置的选项吗?例如,透明度、表面格式等?(我不知道我在说什么)
5)这可能意味着图形处理器正在进行隐式格式转换,但我检查了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, 8,
EGL_RED_SIZE, 8,
EGL_NONE
};初始设置:
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, ctx->frameW, ctx->frameH, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL); /* also for U/V */后续部分替换:
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, ctx->frameW, ctx->frameH, GL_LUMINANCE, GL_UNSIGNED_BYTE, yBuffer); /*also for U/V */我正在尝试以~30FPS或~60FPS的标清或720P高清分辨率渲染视频。
发布于 2013-03-23 08:13:28
这是我们已向ARM报告的已知驱动程序问题。将来的更新应该会修复它。
发布于 2013-03-23 08:31:17
编辑状态更新
我们现在已经成功地在公共固件上重现了一个路径的缓慢上传条件,你可能会碰到这个问题,这个问题将在下一个驱动程序版本中得到修复。
如果对要上载到其中的纹理使用双缓冲区纹理ID (例如,frame N= ID X、N+1 = ID Y、N+2 = ID X、N+3 =ID Y等),则有助于避免在当前固件中出现这种情况。
谢谢,Iso
发布于 2013-08-05 15:46:34
我可以确认这个问题已经在Android 4.3中解决了--我看到RGBA格式的性能比Android 4.2.2提高了2-3倍,其他纹理格式的性能提高了10-50倍。这些结果适用于glTexImage2D和glTexSubImage2D。(还不能添加评论,所以我不得不把它放在这里)
编辑:如果你坚持使用4.2.2,你可以尝试使用RGBA纹理,它应该有更好的性能(3-10倍左右,具有更大的2次方纹理尺寸)。
https://stackoverflow.com/questions/15580619
复制相似问题