为什么 Android 上的 setColor 这么慢

Why is setColor so slow on Android

我正在 OPO 设备上对我们的一些代码进行基准测试,该设备通常速度非常快,但我看到了很多 "weird" 性能异常。在深入研究 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 侥幸或其他)。

我找不到 "why" 的真正答案,即使在深入研究代码后,这种情况仍在发生。我的解决方案是为我们主题中的每个样式缓存 Paint 个对象,以便使用类似设置重新绘制组件可以重用以前设置的值。这似乎确实对性能产生了积极影响。