7

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

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

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

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

4

2 回答 2

3

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

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

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

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

于 2012-04-20T17:31:45.400 回答
3

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

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

于 2012-04-20T17:44:33.683 回答