ios - 在 iOS 中使用大量动画绘制 View 的最佳 CPU 效率最高的方法是什么?

标签 ios ios6

我正在尝试为 iOS 项目绘制图形均衡器。

均衡器将有 7 个条,代表不同的频段,并根据实时音频数据上下移动。

谁能建议在 iOS 中解决这个问题的最佳方法?

新的频率数据以大约 11Hz 的频率传入,因此条形必须以每秒 11 次的新大小进行动画处理。

  1. 我是否为每个栏创建一个 UIView 并动态调整其框架高度?
  2. 我是否将条形图绘制为粗 CGStroke 并根据需要在父 View 中重新绘制它们?
  3. 另一种选择?

提前致谢

最佳答案

您想使用 Core Animation。基本原理是创建一堆“层”对象,可以是位图图像、矢量图形或文本。每个层都存储在 GPU 上,大多数操作可以每秒 60 帧的速度进行动画处理。

将层想象成 HTML 页面中的 DOM 节点,它们可以相互嵌套,您可以像 CSS 一样为每个层应用属性。可用属性列表与 GPU 可以高效执行的所有操作相匹配。

听起来您想要矢量形状。基本上,您在启动时创建所有形状,例如在 UIView 子类的 awakeFromNib 方法中。对于简单的矩形,使用 CALayer 并设置背景颜色。对于更复杂的形状,创建一个 CAShapeLayer 和一个 UIBezierPath,然后用 shapeLayer.path = bezierPath.CGPath; 应用它。

然后,无论何时您想要更改某些内容,都可以将这些更改应用到图层对象。例如,我在这里旋转一个带有 1 秒线性动画的图层:

[CATransaction begin];
[CATransaction setAnimationDuration:1];
[CATransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]];

[self.needleLayer setValue:[NSNumber numberWithFloat:DegreesToRadians(degrees) forKeyPath:@"transform.rotation.z"];

[CATransaction commit];


// you'll want to declare this somewhere  
CGFloat DegreesToRadians(CGFloat degrees)
{
  return degrees * M_PI / 180;
}

可以使用 CAKeyframeAnimation 完成更复杂的动画,例如计划连续执行的一系列更改:https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreAnimation_guide/CreatingBasicAnimations/CreatingBasicAnimations.html

注意 Core Animation 只处理 2D 图形。 Apple 有 Scene Kit,它与 3D 基本相同,但到目前为止它只在 OS X 上可用。希望 iOS 8 会包含它,但在那之前如果你想在 iOS 上使用 3D 图形,你需要使用 Open GL。

关于ios - 在 iOS 中使用大量动画绘制 View 的最佳 CPU 效率最高的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23184460/

相关文章:

objective-c - UIActionSheet firstOtherButtonIndex 设置不正确

ios - 将数组字符串对象转换为 float

ios - UIKit 方法中的 "animated" bool 参数是否与设置动画持续时间不同?

iphone - 子类化 UITableViewController 还是使用 Store (MVCS)?

uiviewcontroller - iOS 6 ViewController 正在旋转但不应该

android - 如何在 iphone 中使用 PKCS5padding 和 AES128

iphone - 构建类名形成字符串

iphone - iOS 中的 Windows,从 Android 构建多 Activity 应用程序的最佳方式?

iOS6 应用被拒绝

Javascript 历史记录功能不适用于 iOS 6 上主屏幕提供的网页