模拟器中的慢速 CADisplayLink 动画

Slow CADisplayLink Animation In Simulator

我有两种实现相同精灵动画的方法:

  1. 一个 UIImage 使用 animatedImage(with:duration:).
  2. 为一组 6 张图像设置动画
  3. A UIView 及其 CALayercontents 属性 设置为精灵图集图像——层的 contentsRect 属性 是通过 CADisplayLink 更新。为了确保帧速率独立性,我正在累积增量时间(或 displayLink.duration),直到图像发生变化。当图像发生变化时,我从累积的增量时间中减去一张图像所需的经过时间,然后循环继续。

这两种方法都很有效,而且在我的 iPhone 上看起来几乎相同(如果不完全相同的话)。但是,当 运行 在模拟器中时,#1 似乎以设备速度进行动画处理,而 #2 似乎以明显较慢的速度进行动画处理。

比较我的设备和模拟器的 FPS 时,设备的平均 FPS 约为 59.9 到 60 FPS,而模拟器显示恒定的 60 FPS;这并没有说明 #2 似乎明显变慢了。

那么,为什么 #2 在模拟器中速度较慢?

#1 的代码:

UIImage.animatedImage(with: spriteImages, duration: animationDuration)

#2 的代码:

func update(_ seconds: TimeInterval) {
    accumulatedSeconds += seconds

    // `poseDuration` is `animationDuration / 6`.
    guard accumulatedSeconds >= poseDuration else { return }

    switch currentFrame {
    case 6:
        myView.layer.contentsRect = CGRect(x: 0, y: 0, width: width, height: 1)
        currentFrame = 1
    default:
        myView.layer.contentsRect = CGRect(x: width * Double(currentFrame), y: 0, width: width, height: 1)
        currentFrame += 1
    }

    accumulatedSeconds -= poseDuration
}

基本上,CADisplayLink 在模拟器中运行不佳。仅在设备上测试。