WallpaperService图片绘图效果

时间:2018-10-29 18:03:53

标签: 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,但是绘制简单的位图似乎很复杂。所以我想改用Canvas。

谢谢

编辑:

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

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

在0-1ms的范围内进行查看,在50到300ms之间进行服务。

2 个答案:

答案 0 :(得分:0)

性能实际上取决于位图有多大,如何分配和解除位图,使用哪个位图配置以及运行应用程序的API。

  1. 请记住,大位图对于CPU负载而言非常昂贵,并且会消耗大量RAM。尝试使用当前屏幕密度和分辨率所需的确切尺寸。避免分配由于设备屏幕限制而无法识别的无用尺寸。
  2. 尽可能重用位图。为每个新位图分配g和分配内存确实是很繁重的操作。如果您重复使用位图,则可以疯狂地提高性能。
  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

答案 1 :(得分:0)

您应该使用压缩纹理进行恶意攻击! IE:etc1&etc2

可以使用png或jpeg,但是它们使用cpu性能来快速处理和耗尽电池。