搜尋

首頁  >  問答  >  主體

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

问题如下:

节奏类游戏需要执行很多的跟音乐节拍相关的操作,并且为了保证节奏感,需要让操作跟节拍的关系十分紧密。对两者间隔要求不能超过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相差甚远,且不稳定):

阿神阿神2772 天前535

全部回覆(3)我來回復

  • PHP中文网

    PHP中文网2017-04-18 09:58:48

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

    回覆
    0
  • 巴扎黑

    巴扎黑2017-04-18 09:58:48

    CADisplayLink?

    回覆
    0
  • 怪我咯

    怪我咯2017-04-18 09:58:48

    提一個工程而非技術上的思路。

    程式啟動時先執行測試平均的延遲時間,然後仍然使用標準的時間來定時,但使用標準的時間和平均延遲時間的時間差來延遲執行。

    回覆
    0
  • 取消回覆