DrawAllocation:绘图代码中的内存分配

时间:2014-12-31 06:24:54

标签: android performance lint

针对我的代码推出新Lint。它提出了许多好的建议,但这个我无法理解。

  

DrawAllocation:

     

绘图代码中的内存分配

     

说明:

     

在绘图代码中查找内存分配。   您应该避免在绘图或布局操作期间分配对象。这些是经常调用的,因此可以通过对象分配引起的垃圾收集暂停来中断平滑的UI。

     

通常处理这种方法的方法是预先分配所需的对象,并为每次绘图操作重复使用它们。

     

有些方法代表您分配内存(例如Bitmap.create),这些方法应该以相同的方式处理。

有人能帮我解决这个问题吗? 对代码示例的解释更加友好。

1 个答案:

答案 0 :(得分:1)

当您在经常调用的方法中分配内存以在屏幕上绘制内容时,会出现此Lint警告。通过预先分配内存可以避免分配和释放内存,从而提高性能。

代码示例。例如,我们有一些扩展View的类。我们覆盖其onDraw()方法:

@Override
protected void onDraw(Canvas canvas) {
    // following line allocates memory - really bad place for that
    Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
    canvas.drawBitmap(bitmap, 100, 100, null);
}

我们只想显示一些位图。但是,每次调用onDraw()(经常发生)时,都会创建新的位图并分配内存。执行onDraw()后,此内存可能也会被释放。所以,Lint会在这里给我们一个有用的警告,这是一个性能问题。

我们可以做得更好:

private Bitmap bitmap; 

public OurView(Context context) {
   super(context);
   // pre-allocate bitmap so we can use it later
   bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
}

@Override
protected void onDraw(Canvas canvas) {
    // much faster - no allocation/deallocation of bitmap
    canvas.drawBitmap(bitmap, 100, 100, null);
}