【问题标题】:WallpaperService Image Drawing PerformanceWallpaperService 图像绘制性能
【发布时间】:2019-04-02 17:31:33
【问题描述】:

我正在为 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);
        }
    }

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

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

谢谢

编辑:

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

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

在 0-1 毫秒内获取视图,在 50 到 300 毫秒之间获取服务。

【问题讨论】:

    标签: android android-canvas live-wallpaper


    【解决方案1】:

    性能实际上取决于您的位图有多大、如何分配和解除分配、您使用的位图配置以及您运行应用程序的 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

    【讨论】:

      【解决方案2】:

      您应该使用压缩纹理来处理恶意!即:etc1 & etc2

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

      【讨论】:

      • 嗨,乌勒。欢迎来到 StackOverflow。像这样的简短响应应该作为 cmets 进行。请参阅这些提示以了解答案 How to Answer 的预期内容。亲切的问候。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-12
      • 1970-01-01
      • 2011-03-30
      • 1970-01-01
      • 2015-07-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多