模拟器中的慢速 CADisplayLink 动画
Slow CADisplayLink Animation In Simulator
我有两种实现相同精灵动画的方法:
- 一个
UIImage
使用 animatedImage(with:duration:)
. 为一组 6 张图像设置动画
- A
UIView
及其 CALayer
的 contents
属性 设置为精灵图集图像——层的 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 在模拟器中运行不佳。仅在设备上测试。
我有两种实现相同精灵动画的方法:
- 一个
UIImage
使用animatedImage(with:duration:)
. 为一组 6 张图像设置动画
- A
UIView
及其CALayer
的contents
属性 设置为精灵图集图像——层的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 在模拟器中运行不佳。仅在设备上测试。