在iOS中使用大量动画绘制视图的最有效CPU方法是什么?

时间:2014-04-20 15:54:23

标签: ios ios6

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

均衡器将有7个条形,代表不同的频段,而不是基于实时音频数据上下移动。

有人可以建议在iOS中使用这种方式的最佳方式吗?

新的频率数据大约为11Hz,因此条形图必须以每秒11次的速度动画到新的大小。

  1. 我是否为每个栏创建了一个UIView并动态调整其框架高度?
  2. 我是否将条形图绘制为厚CGStrokes并根据需要在父视图中重绘它们?
  3. 另一种选择?
  4. 提前致谢

3 个答案:

答案 0 :(得分:1)

如果条形图是纯色,那么根据需要调整大小的CALayers可能是最有效的方法。这允许您在大小之间选择性地进行动画处理。

查看调整大小触发布局周期,这是您不想要的。使用CG调用绘图非常慢。

显然唯一真正的方法是使用乐器和核心动画工具分析(在设备上)。但从经验来看,图层大小比绘图更快。

答案 1 :(得分:1)

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

将层视为HTML页面中的DOM节点,它们可以相互嵌套,并且可以将属性应用于与CSS类似的每个节点。可用的属性列表匹配GPU可以有效执行的所有操作。

听起来你想要矢量形状。基本上,您在启动时创建所有形状,例如在awakeFromNib子类的UIView方法中。对于简单的矩形,请使用CALayer并设置背景颜色。对于更复杂的形状,请创建CAShapeLayerUIBezierPath,然后将其应用于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

答案 2 :(得分:-1)

绝对不是每个UIView - 而是整个均衡器的单个UIView。使用适当的CG调用填充drawRect方法以绘制所需的任何内容。您可以根据需要使用适当的数据对视图进行排队。利用CADisplayLink可以帮助您获得您正在寻找的帧率。

https://developer.apple.com/library/ios/documentation/QuartzCore/Reference/CADisplayLink_ClassRef/Reference/Reference.html

注意:如果你喜欢比UIView更重的东西,你也可以将CALayer子类化并绘制在其中,但我认为你对前者没问题。