Хорошо, у меня есть несколько ответов после еще нескольких тестов, поэтому я делюсь ими с любыми заинтересованными.
Я поместил переменную для измерения временных интервалов между тиками внутри play
method (метод, который фактически отправляет сообщение play
объекту AVAudioPlayer
), и, как показал мой простой эксперимент сравнения с внешним наблюдением, 60 ударов в минуту были слишком медленными - я получил эти временные интервалы (в секундах):
1.004915
1.009982
1.010014
1.010013
1.010028
1.010105
1.010095
1.010105
Мой вывод состоял в том, что после каждого интервала в 1 секунду проходит некоторое время служебной нагрузки и что через несколько десятков секунд дополнительное время (около 10 мсек) накапливается до заметной величины -- довольно плохо для метронома.Поэтому вместо измерения интервала между вызовами я решил измерить интервал total от первого вызова, чтобы ошибка не накапливалась.Другими словами, я заменил это условие:
while (continuePlaying && ((currentTime0 + [duration doubleValue]) >= currentTime1)
на это условие:
while (continuePlaying && ((_currentTime0 + _cnt * [duration doubleValue]) >= currentTime1 ))
, где теперь _currentTime0
и _cnt
являются членами класса (извините, если это c ++jargon, я новичок в 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 с точностью не менее миллисекунды)).
Я буду рад услышать больше информации о том, что вызывает дополнительное время - 10 мсек звучит как вечность для современного процессора - хотя я не знаком со спецификациями процессора iPod (это iPod 4G)и Википедия говорит, что CUP - это PowerVR SGX GPU 535 при 200 МГц)