好的,经过更多测试后我有了一些答案,所以我与感兴趣的人分享。
我在里面放置了一个变量来测量刻度之间的时间间隔play
方法(实际发送的方法play
消息给AVAudioPlayer
对象),正如我的简单与外部手表比较实验所示,60 BPM 太慢 - 我得到了这些时间间隔(以秒为单位):
1.004915
1.009982
1.010014
1.010013
1.010028
1.010105
1.010095
1.010105
我的结论是,在计算每 1 秒的间隔后,会消耗一些开销时间,并且在几十秒后,额外的时间(大约 10 毫秒)会累积到显着的量 -- 这对于节拍器来说非常糟糕。所以不是测量间隔between电话,我决定测量total与第一次调用的间隔,这样错误就不会累积。换句话说,我已经替换了这个条件:
while (continuePlaying && ((currentTime0 + [duration doubleValue]) >= currentTime1)
有了这个条件:
while (continuePlaying && ((_currentTime0 + _cnt * [duration doubleValue]) >= currentTime1 ))
现在在哪里_currentTime0
and _cnt
是类成员(抱歉,如果这是一个 C++ 术语,我对 Obj-C 还很陌生),前者保存第一次调用该方法的时间戳,后者是一个int
计算刻度数(==函数调用)。这导致了以下测量的时间间隔:
1.003942
0.999754
0.999959
1.000213
0.999974
0.999451
1.000581
0.999470
1.000370
0.999723
1.000244
1.000222
0.999869
很明显,即使不计算平均值,这些值也会在 1.0 秒左右波动(平均值接近 1.0,精度至少为一毫秒)。
我很高兴听到更多有关导致额外时间流逝的原因的见解 - 对于现代 CPU 来说 10 毫秒听起来像是永恒 - 尽管我不熟悉 iPod CPU 的规格(它是 iPod 4G,维基百科说 CUP 是 PowerVR) SGX GPU 535 @ 200 MHz)