如何优化Android中的位图绘制?

时间:2015-05-08 23:50:12

标签: android

在我的Android应用中,我收到了专有格式的远程视频流。当一个新的网络数据包到达时,我本地解码它并获得一个位图。在UI中,此位图通过setImageBitmap()方法显示在ImageView控件中。

我能够每秒处理12到14帧。我想知道是否有一种方法可以在性能方面对其进行优化。也许我可以使用硬件加速。

1 个答案:

答案 0 :(得分:1)

为什么不使用已为您做过所有这类事情的VideoView

然而:

  • 我认为您应该使用SurfaceView代替ImageView。使用SurfaceView,您拥有自己的专用线程,负责在画布上绘图。因此重绘速度更快。

  • 我猜你是在异步线程中编码一个帧位图,这完全没问题。但你应该考虑如何并行化。基本上使用ThreadPool或类似的东西将您的视频解码为单个位图。将它们放在Buffer中,可以是FifoListQueue或其他什么,但请记住,一个线程可能比另一个线程更快,所以你更好为每个解码任务提供一个订单号,以便您可以按正确的顺序将编码的位图添加到Buffer中。 SurfaceView next应始终从缓冲区中获取第一个图像并将其显示在屏幕上。

  • 安排SurfaceView线程重绘为每秒60帧。因此,不要在while-loop考虑更智能(预定)的解决方案时反复重新绘制。

  • 仅在Buffer包含足够图像时重绘(您必须自行确定缓冲区中的图像数量或谷歌)。否则显示“加载/缓冲”动画

  • 垃圾收集可能需要一些时间,因此请尽量减少垃圾收集运行的时间。位图关联可能会占用大量内存,因此垃圾收集器需要经常运行才能为下一个位图找到空闲内存。因此,如果您能够以更适合智能手机的宽度/高度(可能是针对不同显示尺寸的不同文件)提供视频源文件,请考虑一下。想想你如何减少内存消耗。 BitmapFactory中有各种选项可用于减少内存消耗(减少正在运行的垃圾回收),如inSampleSizeinBitmap这似乎是一个不错的选择,因为所有位图都应具有相同的宽度/身高。看看here。您还可以使用BitmapConfig.RGB_565来降低位图质量。