android - WallpaperService 图像绘制性能

标签 android android-canvas live-wallpaper

我正在为 Android 开发动态壁纸。代码有效,但我遇到了性能问题。基本上我正在绘制位图并移动它们。有 15 张小图像,效果很好。但是有了 50 张更大的图像,它就开始滞后了。

在我的移动对象中,我在构造函数中创建位图并像这样显示它:

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);
}

在我的墙纸服务中,我这样调用 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);
        }
    }

我尝试将它与普通 View 一起使用,它是 onDraw 并且在那里工作正常。它非常光滑。现在我在问自己如何提高性能。我也尝试了不同的 delayMillis,但性能并没有提高。

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

谢谢

编辑:

我已经测试了 View 和服务之间的性能。这部分:

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

在 0-1 毫秒内进入 View ,在 50 到 300 毫秒之间进入服务。

最佳答案

性能实际上取决于您的位图有多大、您如何分配和释放它们、您使用哪个位图配置以及您运行应用程序的 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/cache-bitmap

关于android - WallpaperService 图像绘制性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53051350/

相关文章:

java - canvas 不在 java android 中绘制

android - 如何制作动画 Android 动态壁纸?

安卓 : Restoring a Live Wallpaper

android - 蓝牙查找设备落下程序

android - 在 Canvas 上绘制一个以触摸点为中心的矩形

android - Android Rect对象中的top,left,right和bottom是什么意思

android - 为什么在使用 min3d 框架加载 3d 模型时出现 "android.content.res.Resources$NotFoundException: Resource ID #0x0"?

android - 在测试期间显示触摸

android - 从 Recycler 中的 Firebase 存储加载图像显示图像发生变化

android studio 3.3.1 color..xml 错误 : Can't determine type for tag '<selector xmlns:android="http://schemas. android.com/apk/res/android">