WallpaperService图像绘制性能

use*_*661 5 android live-wallpaper android-canvas

我正在为Android的livewallpaper工作.代码有效,但我遇到了性能问题.基本上我正在绘制位图并移动它们.有15个小图像,它工作得很好.但是有50个更大的图像,它开始滞后.

在我的移动对象中,我在构造函数中创建了Bitmap并将其显示如下:

public void drawFrame(Canvas canvas) {
    Position p = movingStrategy.move();
    Matrix matrix = new Matrix();
    matrix.postScale(scale, scale);
    matrix.postRotate(p.getRotation());
    matrix.postTranslate(p.getPositionX(), p.getPositionY());
    canvas.drawBitmap(bitmap, matrix, paint);
}
Run Code Online (Sandbox Code Playgroud)

在我的wallpaperservice中,我正在调用onDraw:

 private void draw() {
        handler.removeCallbacks(drawRunner);
        SurfaceHolder holder = getSurfaceHolder();
        Canvas canvas = null;
        try {
            canvas = holder.lockCanvas();
            if (canvas != null) {
                canvas.save();
                canvas.drawColor(Color.BLACK);
                for (DrawElement element : elements) {
                    element.drawFrame(canvas);
                }
                canvas.restore();
            }
        } finally {
            if (canvas != null)
                holder.unlockCanvasAndPost(canvas);
        }
        if (visible) {
            handler.postDelayed(drawRunner, 1);
        }
    }
Run Code Online (Sandbox Code Playgroud)

我尝试使用普通的View和它的onDraw,它在那里工作正常.它很顺利.现在我问自己如何改善性能.我也尝试了不同的delayMillis,但性能并没有增加.

我也听说过GLWallpaperService,但是绘制简单的Bitmaps似乎很复杂.所以我想改用Canvas.

谢谢

编辑:

我已经测试了视图和服务之间的性能.这部分:

  long start = System.currentTimeMillis();
  for (DrawElement element : elements) {
       element.drawFrame(canvas);
  }
  Log.e("DrawingTime", Long.toString(System.currentTimeMillis()-start));
Run Code Online (Sandbox Code Playgroud)

在0到1ms的视图中,在50到300ms之间的服务中.

Yaz*_*006 0

性能实际上取决于您的位图有多大、如何分配和取消分配它们、您使用哪个位图配置以及您在哪个 API 上运行应用程序。

  1. 请记住,大位图对于 CPU 负载来说非常昂贵,并且会消耗大量 RAM。尝试根据当前屏幕密度和分辨率的需要使用精确的尺寸。避免分配由于设备屏幕限制而无法识别的无用尺寸。
  2. 如果可能的话,重用您的位图。为每个新位图分配和取消分配内存确实是一项繁重的操作。如果您重复使用位图,您可以获得疯狂的性能提升。
  3. 尝试为您的位图使用尽可能低的配置。当然,如果是一些照片,则有必要保留它们的所有颜色范围,但即使在这种情况下,也有一些配置可以让您消耗两倍的内存,而几乎不可见的质量损失。
  4. 在一些早期的 Android 版本上,由于 dalvik 的特定实现,位图存在巨大的问题。毫无疑问,您的应用程序在 24+ API 上可以运行得更好。我并不是说您应该增加支持的最低 SDK 版本,但无论如何您可能应该检查它在所有支持的 API 范围上的工作方式。

检查这个有用的东西:

https://developer.android.com/topic/performance/graphics/ https://developer.android.com/topic/performance/graphics/manage-memory https://developer.android.com/topic/performance/graphics /缓存位图