NSTimer

iOS上的每个线程都管理了一个NSRunloop, 字面上看就是通过一个循环来完成一些任务列表。对主线程,这些任务包含如下几项:

  • 处理触摸事件
  • 发送和接收网络数据包
  • 执行使用gcd的代码
  • 处理计时器行为
  • 屏幕重绘

当你设置一个NSTimer,他会被插入到当前任务列表中,然后直到指定时间过去之后才会被执行。但是何时启动定时器并没有一个时间上限,而且它只会在列表中上一个任务完成之后开始执行。这通常会导致有几毫秒的延迟,但是如果上一个任务过了很久才完成就会导致延迟很长一段时间。
屏幕重绘的频率是一秒钟60次,但是和定时器行为一样,如果列表中上一个任务执行了很长一段时间,他也会延迟。这些延迟都是一个随机值,于是就不能保证定时器精准的一秒钟执行六十次。有时候发生在屏幕重绘之后,这就会使得更新屏幕有个延迟,看起来就是动画卡壳了。有时候定时器会在屏幕更新的时候执行两次,于是动画看起来就跳动了。

我们可以通过一些途径来优化:

  • 我们可以用CADisplayLink让更新频率严格控制在屏幕刷新之后。
  • 基于真实帧的持续时间而不是假设的更新频率来做动画。
  • 调整动画及时期的runloop 模式,这样就不会被别的事件干扰

你可能感兴趣的:(NSTimer)