【问题标题】:How to increase performance of bitmap drawing on Android如何在 Android 上提高位图绘制的性能
【发布时间】:2012-05-01 22:30:04
【问题描述】:

我创建了一个基于 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 在本机代码中完全渲染,但我读过它也可能是 slow。那么现在呢?...

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

【问题讨论】:

  • 没有办法直接从native代码访问SurfaceView的缓冲区吗?相机预览做到了这一点。
  • AFAIK 不,至少没有使用 NDK 的标准方式。当然可以链接安卓源,但是会造成兼容性的问题……

标签: android opengl-es android-ndk ffmpeg


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢,你是对的;我将切换回 OpenGLES1.x。我没有使用 Open GL 的经验,所以我的假设是越新越好。我已经阅读了您提供的链接中的文章。实际上,我想我一定已经阅读了谷歌能够为我找到的所有相关文章,即使是 iOS 平台......经过一整天的研究,我仍然有点迷茫。
  • 两个版本访问相同的硬件。 2.0 的强大功能来自您可以访问的附加硬件(着色器处理器)。所以从这个角度来看,我认为很难说一个人是好是坏,它通常就像决定你需要完成什么一样简单。
【解决方案2】:

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

您无法旋转纹理,但听起来您不需要这样做。

【讨论】:

  • 你说得对,我不在乎轮换。我发现了一些使用 OpenGLES1.x (github.com/richq/glbuffer) 的好例子,它使用了你提到的函数。
猜你喜欢
  • 2011-05-14
  • 2023-04-03
  • 1970-01-01
  • 2019-08-23
  • 2020-08-02
  • 2013-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多