为什么在安卓系统上setColor方法如此缓慢

7
我正在对我们的代码在一台性能通常很好的OPO设备上进行基准测试,但是我发现有很多“奇怪”的性能问题。在深入挖掘Android本地代码之前,我想在这里问一下。
我看到的是调用paint.setColor(argbInt)需要大约5倍于以下调用的执行时间:
paint.setStyle(Paint.Style.FILL);
paint.setAntiAlias(false);
canvas.drawRect(x, y, x + w, y + h, paint);
paint.setAntiAlias(antialias);

现在绘制矩形是在GPU上进行的,所以我想我不会看到任何开销。但是为什么我对绘画颜色有开销呢?
作为自然的后续,如何减少上述开销?
我还看到了相当多的canvas.restore()的开销(大约比上面的代码慢4倍),但我想这是有道理的,因为它可能是一个复杂的操作。我只是不明白为什么setColor会很慢?
为记录,我使用System.nanoTime()在OPO上测试了性能,并且在性能方面相当稳定(不是突然的GC故障或其他问题)。

我猜setColor会触发一些需要时间的事件。如果您的paint和/或其子组件中有任何自定义艺术品,则应重新计算显示。我再说一遍:我只是猜测,因为我不是Android开发人员 :) - Lajos Arpad
你尝试过创建颜色实例来应用吗? - homerun
因为setColor函数可能会使CPU循环遍历所有涂料的像素,而其他函数则设置一些变量,让GPU来完成大部分重工作。 - Gavriel
我还没有尝试过接受颜色的版本,因为变量来自一个相当不同的位置,但保存这个版本会很有趣。除了固体以外,绘画中没有其他东西,所以不应该有像素需要循环。这实际上是一个填充了固体颜色的矩形。 - Shai Almog
什么是替代方案?有没有更快的解决方案? - Bijoy Thangaraj
我没有找到任何原因,所以我选择了一个解决方法并在下面回答了。 - Shai Almog
1个回答

1
我在查看代码后仍然找不到“为什么”会发生这种情况的真正答案。我的解决方案是为我们主题中的每个样式缓存Paint对象,以便使用类似设置重新绘制组件时可以重复使用先前设置的值。这似乎对性能有积极影响。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接