【问题标题】:Why is setColor so slow on Android为什么 setColor 在 Android 上这么慢
【发布时间】: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


【解决方案1】:

即使在挖掘代码之后,我也找不到“为什么”会发生这种情况的真正答案。我的解决方案是为我们主题中的每种样式缓存Paint 对象,以便使用类似设置重新绘制组件可以重用先前设置的值。这似乎确实对性能产生了积极影响。

【讨论】:

    猜你喜欢
    • 2021-08-07
    • 1970-01-01
    • 1970-01-01
    • 2010-10-29
    • 2010-11-12
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    相关资源
    最近更新 更多