#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 Понял, большое вам спасибо!
Ответ №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.