如何在安卓上提高位图绘制的性能



我创建了一个基于FFmpeg的电影播放器。它工作正常。解码速度非常快,在LG P970(带霓虹灯的Cortex A8)上,我的平均速度为70 fps,具有640 x 424分辨率的视频流,包括YUV2RGB转换。但是,存在一个瓶颈。它是在画布上绘制的。

我使用 jnigraphics 本机库将图片数据填充到本机端的位图中,然后在 SurfaceView 的画布上绘制此位图。这是非常简单和常见的方法,但是对于分辨率为 44 x 640 的位图,绘制需要 44 毫秒,这会将 fps 降低到 23 并使这种技术无法使用......它比整个A/V帧解码需要更多!

有什么方法可以更快地绘制位图吗?我更愿意使用 OpenGLES 2 完全在本机代码中渲染,但我读过它也可能很慢。那现在怎么办?...

如何尽可能快地渲染位图?

在 GLES1.x 中绘制它们。您不需要使用 GLES2,因为对于着色器,您将无法使用,或者至少在您的问题上下文中不会使用着色器,这将是使用 GLES2.x 的一般主要原因。因此,为了简单起见,GLES1.x将是理想的选择。您需要做的就是将字节缓冲区绘制到屏幕上。在我的Galaxy S(活力)上,这大约需要3ms。我的壁纸中字节[]的大小是800x480x3或1152000,这比您正在使用的大小要大得多。

我相信本指南应该为您指明正确的方向。

http://qdevarena.blogspot.com/2009/02/how-to-load-texture-in-android-opengl.html

至于从本机代码访问画布的概念,我会完全避免这种情况,并通过尽可能将所有内容卸载到 GPU 来遵循 OpenGL 实现。

我记得在GoogleIO期间的Replica Island演示中,设计师说使用OpenGL"draw_texture"扩展glDrawTexfOES是最快的屏幕方式,并且比仅绘制带有纹理的常规四边形要快得多(我假设您使用的是OpenGL)。

你不能旋转纹理,但听起来你不需要它。

最新更新