Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone NSTimer贵吗?_Iphone - Fatal编程技术网

Iphone NSTimer贵吗?

Iphone NSTimer贵吗?,iphone,Iphone,我正在使用大约20张小型飞机图像(50x50像素)的UIImageView在iPhone屏幕上制作简单动画。动画通过以计时器间隔移动UIImageViewcenter属性来完成 [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(timerFired:)

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

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

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

您可以同时尝试这两种方法,并使用Xcode附带的内置分析工具来评估资源使用情况。

我不认为这是资源密集型的,但常识似乎表明使用1个计时器可能比使用20个计时器更好

看起来您的计时器设置为每秒启动100次,这似乎有点过分。你是否在每次定时器触发时为每个精灵设置动画?可能想要尝试每秒发射20-30次(或者更少)


您可能还需要查看内置的视图动画功能。似乎它们对你正在做的事情很有用。

计时器实际上非常昂贵,而且耗电量很大。

操作系统(或其上运行的应用程序)每一纳秒不做任何事情,CPU就会以几种低功耗状态之一休眠。当CPU和其他系统从低功耗、空闲状态唤醒时,从空闲状态唤醒系统会产生能源成本。如果计时器导致系统唤醒,则会产生该成本。定时器启动的频率越高,能源成本就越高。在移动设备上,它会严重影响电池寿命

从这个意义上说,将系统唤醒一次,完成所有工作,然后让它再次休眠,让它尽可能多的纳秒,效率要高得多。回到您的示例,如果您对此进行分析,那么使用1个计时器比使用20个计时器更有效,每个计时器每秒触发100次

更高版本的操作系统允许您指定公差(单位为%)。这允许系统将计时器组合在一起,并在同一唤醒事件中执行它们,以节省电源。您所做的似乎不是时间关键型的(从实时执行的角度来看),因此允许公差(例如10%)应该会有所帮助

示例:
[myTimer SetTolerance:0.3]


有关计时器容差的更多信息:

与其尝试让计时器与屏幕重画同步(即每秒60次重画),更好的解决方案是使用
CADisplayLink
,它与屏幕重画一样启动,并为此而构建

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
}

在这个速度下,我可以想象Objective-C的开销可能相当昂贵。关于触发频率:LCD的刷新频率通常为60 Hz,因此尝试更频繁地设置动画实际上是多余的。我正在创建从UIImageView派生的PlaneView对象。计时器在每个PlaneView对象中运行,而不是在将PlaneView作为子视图的ViewController中运行。我还在试验…:-)