[英]What's the best most CPU efficient way to draw views with a lot of animations in iOS?
我正在尝试为iOS项目绘制图形均衡器。
均衡器将具有7条,代表不同的频段,而不是根据实时音频数据上下移动。
谁能建议在iOS中解决此问题的最佳方法?
新的频率数据大约为11Hz,因此条形图必须每秒动画11次。
提前致谢
如果条形图是纯色,则按需调整大小的CALayer可能是最有效的方法。 这样,您还可以选择在尺寸之间进行动画处理。
视图调整大小会触发您不需要的布局周期。 使用CG调用进行绘制非常慢。
显然,唯一真正的发现方法是使用仪器和核心动画工具(在设备上)进行概要分析。 但是从经验来看,图层大小比绘制要快。
您想使用Core Animation。 基本原理是创建一堆“图层”对象,这些对象可以是位图图像,矢量形状或文本。 每层都存储在GPU上,大多数操作可以每秒60帧的速度进行动画处理。
可以将层想象成HTML页面中的DOM节点,它们可以相互嵌套,并且可以像CSS一样将属性应用于每个层。 可用的属性列表与GPU可以有效执行的所有操作匹配。
听起来您想要矢量形状。 基本上,您可以在启动时创建所有形状,例如在UIView
子类的awakeFromNib
方法中。 对于简单的矩形,请使用CALayer
并设置背景色。 对于更复杂的形状,请创建CAShapeLayer
和UIBezierPath
,然后将其与shapeLayer.path = bezierPath.CGPath;
一起应用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
注意“核心动画”仅执行2D图形。 Apple拥有Scene Kit,对于3D来说基本上是相同的东西,但到目前为止,它仅在OS X上可用。希望iOS 8包括它,但是直到那时,如果要在iOS上使用3D图形,则需要使用Open GL。
绝对不是每个UIView,而是整个均衡器的单个UIView。 用适当的CG调用填充drawRect方法以绘制所需的内容。 您可以将视图排队,以根据需要使用适当的数据进行刷新。 利用CADisplayLink可以帮助您获得所需的帧速率。
注意:如果您更喜欢轻于UIView的东西,也可以继承CALayer并在其中进行绘制,但是我认为使用前者会很好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.