【问题标题】:Increase drawing performance on an iPhone 4提高 iPhone 4 的绘图性能
【发布时间】:2014-02-06 12:26:01
【问题描述】:

我关于 StackOverflow 的第一个问题。所以感觉有点害羞......

我已经在 curstom 控件上工作和调整了几个星期了。它使用 ±6 个子类 CALayers 来制作一些精美的动画,以提供最佳的用户反馈。此外,还有 2 个动画 UIView 在用户交互期间添加了一些繁重的动画和重绘。

我设法在 iPhone 5S 上获得了高达 +50fps 的响应速度和性能。但是在 iPhone 4 上,它真的让我哭了:8 ~ 15fps。我试图找出导致这种糟糕表现的原因,但直到现在我才发现除了我可能希望从 Core Animation 中获得很多东西。

在所有 CALayers 上使用 layer.drawsAsynchronously = YES; 可以大大提高响应速度。而且我还去掉了所有不必要的动画(包括隐式动画)。但这仍然不够。 iPhone 4 的性能仍然不是我想要的。

当我切换到 layer.opaque = YES; 时,我注意到很多改进;但是由于我的界面设计,这确实不是一个选项。

你们有什么可以建议研究的吗?是否有任何其他“神奇”属性,例如我可能想尝试或研究的 .drawsAsynchronously

对于如何调试/分析性能,您有什么可以建议的资源吗?

如有任何帮助,我们将不胜感激。提前致谢!

【问题讨论】:

  • 你能发布一些代码来展示你想要做什么吗?
  • 不幸的是,这不仅仅是一小段代码,而是多个 CALayer 子类和视图。最大的问题可能是(多个)BezierPaths 和 Gradients 是基于手势计算的。
  • 我注意到在 iPhone4 上性能下降很多的一件事是透明度。使用不透明的颜色作为背景有很大帮助。
  • 是的,我注意到了相同的 manecosta,但不幸的是,设计不允许我使用不透明的背景。 (感谢 iOS7 风格的模糊背景和半透明覆盖。)

标签: ios objective-c animation calayer drawrect


【解决方案1】:

最快的答案是不要使用 drawRect: 因为它非常昂贵。 CALayers 是最好的方法。

如果您需要绘制复杂的东西,最好考虑使用 Core Graphics,因为它使用 GPU 而不是 CPU,效率更高。您可以使用 Core Graphics 绘制图像并将其添加到视图中。

看看这个link 有很好的解释 UIView 如何工作以及如何编写最有效的代码

【讨论】:

  • 所有动画和“昂贵的”绘图都是使用 CALayer 子类完成的,所以我想我的工作方向是正确的。
  • @MichMich 查看此链接。如果您已经使用 CALayer 完成了绘图,那么更好的方法是将繁重的动画代码放入堆栈溢出,以便有人可以在可能的情况下对其进行优化。
猜你喜欢
  • 2013-01-29
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 2019-08-23
  • 1970-01-01
  • 2023-03-26
相关资源
最近更新 更多