NSTimer贵吗?

时间:2009-04-09 18:17:59

标签: iphone

我正在使用大约20张UIImageView小型飞机图像(50x50像素)在iPhone屏幕上进行简单动画。动画是通过以定时器间隔移动UIImageView中心属性来完成的。

[NSTimer scheduledTimerWithTimeInterval:0.01
                                 target:self
                               selector:@selector(timerFired:)
                               userInfo:nil
                                repeats:YES]

最佳做法是:创建一个NSTimer并循环20 UIImageView以在计时器触发时设置中心属性?或者我应该只为每个NSTimer对象创建一个UIImageViewNSTimer资源是否昂贵?

4 个答案:

答案 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
}