Android 墙纸服务图像绘制性能

Android 墙纸服务图像绘制性能,android,android-canvas,live-wallpaper,Android,Android Canvas,Live Wallpaper,我正在为Android制作livewallpaper。代码可以工作,但我有性能问题。基本上,我绘制位图并移动它们。有15个小图像,效果很好。但是有了50张更大的图片,它就开始落后了 在我的移动对象中,我在Constructor中创建位图,并按如下方式显示: public void drawFrame(Canvas canvas) { Position p = movingStrategy.move(); Matrix matrix = new Matrix(); matr

我正在为Android制作livewallpaper。代码可以工作,但我有性能问题。基本上,我绘制位图并移动它们。有15个小图像,效果很好。但是有了50张更大的图片,它就开始落后了

在我的移动对象中,我在Constructor中创建位图,并按如下方式显示:

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);
        }
    }
我试着用一个普通的视图来使用它,它是onDraw,在那里它工作得很好。它很光滑。现在,我在问自己如何提高绩效。我还尝试了不同的延迟毫秒,但性能没有提高

我也听说过GLP服务,但绘制简单的位图似乎非常复杂。所以我想用画布来代替

多谢各位

编辑:

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

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

在0-1ms范围内观看,在50-300ms范围内观看服务。

性能实际上取决于位图的大小、分配和取消分配的方式、使用的位图配置以及运行应用程序的API

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


    您应该使用压缩纹理来制作唾液!IE:etc1和etc2


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

    Hi Wulle。欢迎来到StackOverflow。像这样的简短回答应该作为评论。请参阅这些提示,了解答案的预期内容。亲切的问候。