我正在使用大约20张UIImageView
小型飞机图像(50x50像素)在iPhone屏幕上进行简单动画。动画是通过以定时器间隔移动UIImageView
中心属性来完成的。
[NSTimer scheduledTimerWithTimeInterval:0.01
target:self
selector:@selector(timerFired:)
userInfo:nil
repeats:YES]
最佳做法是:创建一个NSTimer
并循环20 UIImageView
以在计时器触发时设置中心属性?或者我应该只为每个NSTimer
对象创建一个UIImageView
? NSTimer
资源是否昂贵?
答案 0 :(得分:4)
我不认为这是资源密集型的,但常识似乎要求使用1个计时器可能比20个好。
看起来您的计时器设置为每秒触发100次,这似乎有点过分。你在每个定时器点火时为每个精灵设置动画吗?可能想尝试每秒发射20-30次(或者甚至更少)。
您可能还想查看内置视图动画功能。似乎他们可能会非常适合你正在做的事情。
答案 1 :(得分:3)
您可以尝试使用Xcode附带的内置分析工具来衡量资源使用情况。
答案 2 :(得分:0)
实际上,计时器在能源方面确实很昂贵。
操作系统(或运行于其上的应用程序)每执行十亿分之一秒都不执行任何操作,则CPU处于几种低功耗状态模式之一的睡眠状态。当CPU和其他系统从低功耗,空闲状态唤醒时,将系统从空闲状态唤醒会产生能源成本。如果计时器导致系统唤醒,则会产生该费用。计时器触发的频率越高,能源成本就越高。在移动设备上,它可能会严重影响电池寿命。
从这个意义上讲,唤醒系统一次,完成所有工作然后让它再次休眠尽可能多的纳秒效率要高得多。回到您的示例,如果对此进行分析,则使用1个计时器而不是20个计时器(每个计时器每秒触发100次)应该更有效。
以后的OS版本允许您指定公差(以%为单位)。这允许系统将计时器分组在一起,并在同一唤醒事件中执行它们,以节省功耗。看来您在做什么并不是时间紧迫的(从某种意义上来说是实时执行),因此允许公差(例如10%)应该会有所帮助。
示例:[myTimer setTolerace:0.3];
有关计时器公差的更多信息,请点击此处:https://developer.apple.com/documentation/foundation/nstimer
答案 3 :(得分:0)
与其尝试让 Timer 与屏幕重绘同步(即每秒触发 60 次),更好的解决方案是使用 CADisplayLink
,它在屏幕重绘时触发并为此目的而构建。< /p>
let displayLink = CADisplayLink(target: self, selector: #selector(displayLinkFired))
displayLink.add(to: .main, forMode: .default) // attach to the main run loop
@objc func displayLinkFired() {
// update image view's here
}