objective-c - iOS: 零误差或极小误差的定时执行或延迟执行?

浏览:32日期:2023-12-23

问题描述

问题如下:

节奏类游戏需要执行很多的跟音乐节拍相关的操作,并且为了保证节奏感,需要让操作跟节拍的关系十分紧密。对两者间隔要求不能超过0.02秒或更低。

目前使用了 GCD 中的 asyncAfter(deadline:)方法,不过误差总是要大于0.05秒,并且还无法保证误差会不会传递下去。请问有更好的方式来解决误差吗?

var time = Date().timeIntervalSince1970let dq = DispatchQueue(label: 'queue', qos: .userInitiated, attributes: [.concurrent, .initiallyInactive]) dq.async {self.audioPlayer.play()time = Date().timeIntervalSince1970 } dq.asyncAfter(deadline: .now() + 0.43, execute: {let res = Date().timeIntervalSince1970print(' 误差: (res - time)') })

以下是多次运行控制台打印结果(该数字指的是实际间隔,与期望间隔的0.43相差甚远,且不稳定):

objective-c - iOS: 零误差或极小误差的定时执行或延迟执行?

objective-c - iOS: 零误差或极小误差的定时执行或延迟执行?

objective-c - iOS: 零误差或极小误差的定时执行或延迟执行?

问题解答

回答1:

http://blog.lessfun.com/blog/...

回答2:

CADisplayLink?

回答3:

提一个工程而非技术上的思路。

程序启动时先运行测试平均的延迟时间,然后仍然使用标准的时间来定时,但使用标准的时间和平均延迟时间的时间差来延后执行。

相关文章: