增加clipPath大小会导致滞后

时间:2012-08-29 12:20:52

标签: android android-canvas live-wallpaper

我在循环中增加了clipPath的大小。在循环内部还有另一个循环,它创建了一些更多的clipPaths,我用它来降低alpha值,这样我就可以获得过渡效果。但随着clipPath的大小增加,转换变得缓慢且滞后。

就是这样的

int size = 5;
Paint p1 = new Paint();
Path path = new Path();
for (int i = 0; i < 20; i++) {
    path.addCircle(centerX, centerY, size, Path.Direction.CCW);
    canvas.clipPath(path);
    canvas.drawBitmap(bmp2, 0, 0, null);
    path.reset();
    int incr = size;
    while (p1.getAlpha() != 0) {
        incr -= 1;
        p1.setAlpha(p1.getAlpha() - 5);
        path.addCircle(centerX, centerY, incr, Path.Direction.CCW);
        canvas.clipPath(path, Op.UNION);
        canvas.drawBitmap(bmp2, 0, 0, p1);
        path.reset();
    }
    size += 10;
}

期望的结果

Gradient

我知道这是一个糟糕的方法,但这是我能想到的全部。

1 个答案:

答案 0 :(得分:2)

Hardware Acceleration中可能适用的一些提示:

  

以下列表描述了不受支持的已知操作   硬件加速:

     

Canvas.clipPath()

     

[...]

     

不要在绘图方法中创建渲染对象

     

一个常见的错误是每次调用渲染方法时都要创建一个新的Paint或一个新的Path。这迫使垃圾收集器   经常运行,并绕过缓存和优化   硬件管道。

另外,我已经读过/听到过,无论何时修改路径,都会生成一个掩码并重新上传到GPU(?),所以你不应该经常修改它们。所以是的,那段代码可能没有快速运行。

您可能对以下视频感兴趣:

编辑:我不知道一个实际的替代方案,但如果除了使用路径之外别无其他方法,您可以保留其中的数组,而无需修改它们。但是,如果动画有很多帧,那可能意味着很多内存。