存储多个位图时的性能问题

时间:2013-07-26 13:45:01

标签: android performance bitmap android-view

我创建了一个自定义View对象,它覆盖onDraw方法来绘制一个相当复杂的UI。我将其中5个自定义视图添加到LinearLayout 中,但任何时候只能看到一个视图

根据用户在我的应用程序中的操作,我在每个属性上切换View.Visibility属性,以便只有一个可见。

为了澄清,我正在使用的方法适用于我,它似乎相当敏感。我只是担心这种方法会如何影响低端或低端设备。

以下是我当前代码的示例:

自定义视图

public class MyDrawingView extends View {
  private Bitmap mViewBitmap;

  private int mWidth = 1024; // The width of the device screen
  private int mHeight = 600; // Example value, this is dynamic

  @Override
  protected void onDraw(Canvas canvas) {
    // Copy the in-memory bitmap to the canvas.
    if(mViewBitmap != null) canvas.drawBitmap(mViewBitmap, 0, 0, mCanvasPaint);
  }

  private void drawMe() {
    if(mViewBitmap == null) mViewBitmap = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888);
    Canvas c = new Canvas(mViewBitmap);
    c.drawBitmap(...);
    c.drawText(...);
    // Multiple different methods here drawing onto the canvas
    c.save();
  }
}

布局XML

<LinearLayout>
  <com.company.project.ui.MyDrawingView
            android:id="@+id/myCustomView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
  <com.company.project.ui.MyDrawingView
            android:id="@+id/myCustomView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
  <com.company.project.ui.MyDrawingView
            android:id="@+id/myCustomView3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
  <com.company.project.ui.MyDrawingView
            android:id="@+id/myCustomView4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
  <com.company.project.ui.MyDrawingView
            android:id="@+id/myCustomView5"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
</LinearLayout>

问题

  1. 我是否应该始终在内存中保留我的View的这5个独立实例,大小为1024x600的位图?
  2. 我应该合并这些功能,这样我只需要在我的布局XML中添加一个View,然后每次需要更新View时重新生成一个Bitmap吗?
  3. 哪个选项更适合性能,请记住重绘我的Bitmap可能需要一些时间,因为它的复杂性?
  4. 文档

    我已经阅读了Managing Bitmap Memory上的Android文档,不过我觉得我已经实现了自定义视图中已经列出的要点,我认为它不能完全覆盖我的场景。

2 个答案:

答案 0 :(得分:0)

我不确定你为什么要在LinearLayout内放置具有设备大小的视图,然后相应地隐藏它们。你最好使用ViewFlipper或更好的ViewPager

最好的一个是ViewPager,从那时起,当不可见时,你可以从内存中解除分配位图。

此外,如果您要从互联网或SD卡加载图像,可以使用Universal Image Loader,这样可以简化缓存和内存管理。无需重新发明轮子:)

答案 1 :(得分:0)

好的,所以我接受了Geobits对堆大小的评论,并提出了解决问题的方法:

  1. 使用一个视图,根据需要动态将数据绘制到单个内部 Bitmap
  2. 将位图类型更改为RGB_565以使位图略小
  3. 尽可能删除/回收位图
  4. 在上述之后,我设法将整个应用程序所需的RAM减少到25Mb,我非常满意。