问题如下:

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

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

var time = Date().timeIntervalSince1970
let 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().timeIntervalSince1970
print(" 误差: \(res - time)") })

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

iOS: 零误差或极小误差的定时执行或延迟执行? >> ios

这个答案描述的挺清楚的:
http://www.goodpm.net/postreply/ios/1010000008928622/iOS零误差或极小误差的定时执行或延迟执行.html

最新文章

  1. 【原】ajaxupload.js上传报错处理方法
  2. git以及git flow 的使用
  3. 2013 ACM/ICPC 长沙现场赛 C题 - Collision (ZOJ 3728)
  4. TCP头分析+面试题
  5. Windows下nc文件传输
  6. C# 运算符 if
  7. OpenCV学习(3)--Mat矩阵的操作
  8. HDU - 5036 Operation the Sequence
  9. XTU 1249 Rolling Variance
  10. 配置Windows为NTP服务器
  11. Linux网络文件系统的实现与调试
  12. 使用nifi采集数据要配置的环境
  13. SharedPreferences存储读取数据
  14. 解决org.hibernate.HibernateException: identifier of an instance of com.ahd.entity.Order was altered from2 to 0
  15. HTML+CSS写下拉菜单
  16. IntelliJIDEA永久注册使用
  17. Android-社会化分享
  18. flask日志
  19. Entity Framework 6.0 Tutorials(7):DbSet.AddRange & DbSet.RemoveRange
  20. 线程协作-Semaphore并发限制

热门文章

  1. ZOJ 3494 BCD Code (AC自己主动机 + 数位DP)
  2. ZooKeeper伪集群环境搭建
  3. bzoj4519: [Cqoi2016]不同的最小割(分治最小割)
  4. Linux常用命令之rpm安装命令
  5. web.xml配置详解(转载)
  6. 51nod 1101 换零钱 完全背包的变型 动态规划
  7. hiho 172周 - 二维树状数组模板题
  8. 一个简单的MyBatis项目(应用)
  9. checkbox控制显示隐藏
  10. pyftpdlib 搭建ftp环境