Swift: существует ли максимальная скорость таймера?

#swift #timer

#swift #таймер

Вопрос:

На мой вопрос я ссылаюсь Timer на Swift из документации Apple:

 Timer.scheduledTimer(timeInterval ti: TimeInterval, 
                     target aTarget: Any, 
                     selector aSelector: Selector, 
                     userInfo: Any?, 
                     repeats yesOrNo: Bool) -> Timer
  

Мой вопрос касается timeInterval параметра: есть ли десятичное значение больше 0, при котором скорость таймера оставалась бы постоянной? Я спрашиваю, потому что после выполнения некоторых тестов использование интервала 0.00001 и 0.00000001 , похоже, не привело к каким-либо заметным различиям. Я не нашел ответа ни в документации, ни в Google reasearch.

Комментарии:

1. 0,00000001 — это 0,01 микросекунды или 10 наносекунд. Типичный процессор среднего класса в наши дни будет работать на частоте около 3,5 ГГц, что составляет один тактовый импульс каждые 0,286 нано секунды. Чтобы таймер работал с такой скоростью, один из каждых ~ 35 тактов должен быть срабатыванием таймера. Это… нет, где это возможно. Какой у вас есть вариант использования, который мог бы даже выиграть от чего-то подобного?

2. @Alexander Просто я использовал таймер для простой анимации, и я понял, что могу увеличить движение вместо того, чтобы ускорять скорость таймера.

3. Действительно. И, учитывая, что отображение обновляется только со скоростью 30, 60 или максимум 120 кадров в секунду, нет смысла обновлять анимацию быстрее, чем это. CADisplayLink кажется идеальным для вашего варианта использования.

4. @Alexander Понял, большое вам спасибо!

5. developer.apple.com/documentation/uikit/uiscreen/…

Ответ №1:

В iOS NSTimer вызывается в цикле выполнения основного потока, и, следовательно, максимальная скорость, с которой он может быть надежно вызван, обычно составляет от 30 до 60 раз в секунду (возможно, до 120 раз в секунду на более новом iPad Pro), связанная с частотой кадров на дисплее. Таким образом, самый короткий надежный интервал времени обычно находится в диапазоне от 8 до 33,3 миллисекунд. Конечно, не 10 US.

Более надежным таймером является использование CADisplayLink, который обычно более надежно привязан к частоте кадров дисплея 60 кадров в секунду, чем NSTimer, который, по-видимому, имеет более низкий приоритет, что приводит к большей задержке или дрожанию во время запуска. Для более точного разрешения синхронизации вы можете попробовать использовать таймер отправки GCD, который поддерживает параметр leeway, в выделенном потоке или даже сидеть в цикле вращения, опрашивая таймер Маха.

Комментарии:

1. Вот хорошая статья в блоге об экспериментах с таймером iOS: atastypixel.com/blog/experiments-with-precise-timing-in-ios

2. Спасибо за ответ. Я скорее новичок в работе с таймерами, но разве это не NSTimer Timer две разные вещи?

3. Timer — это новое имя Swift 5 для того же базового класса, что и NSTimer в Objective C.

4. @hotpaw2 Timer — это имя Swift 3 (а не 5) для NSTimer.