【发布时间】:2016-04-19 01:06:40
【问题描述】:
我正在一个 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 会触发一些需要时间的事件。如果您的油漆和/或其子组件中有任何自定义图稿,则应重新计算显示。我再说一遍:我猜,因为我不是 Android 开发人员 :)
-
您是否尝试过创建 Color 实例来应用?
-
'因为可能在 setColor 中,CPU 循环遍历所有的绘画像素,而其他的它设置了一些变量,而 GPU 完成了剩下的繁重工作
-
我还没有尝试过接受颜色的版本,因为变量来自一个完全不同的位置,但保存起来会很有趣。除了固体之外,油漆中没有任何东西,所以应该没有像素可以循环。这实际上是一个纯色的填充矩形。
-
什么是替代方案?有没有更快的解决方案?
标签: java android performance codenameone