Миллисекундный таймер? - PullRequest
0 голосов
/ 15 апреля 2020

Кто-нибудь знает, как сделать таймер с интервалом 0,001? Я где-то читал, что Timer не может иметь интервал времени ниже 0,02, и мой таймер ведет себя таким образом.

Мой таймер:

timer = Timer.scheduledTimer(timeInterval: 0.001, target: self, selector: #selector(self.updateTimer), userInfo: nil, repeats: true)

@objc func updateTimer() {
   miliseconds += 0.001
}

Ответы [ 2 ]

3 голосов
/ 15 апреля 2020

Да, вы можете иметь временные интервалы менее 0,02 секунды. Например, интервал 0,01 секунды легко достигается. Но через 0,001 или 0,0001 секунды вы начинаете ограничиваться практическими соображениями о том, как много вы могли бы достичь sh за этот период времени.

Но если ваша цель состоит в том, чтобы представить что-то в пользовательском интерфейсе, редко есть какая-либо точка для превышения максимальных кадров устройства в секунду (обычно 60 кадров в секунду). Если экран можно обновлять только каждые 60 секунд, какой смысл вычислять чаще, чем этот? Это просто потраченные впустую циклы процессора. Кстати, если бы мы пытались достичь оптимальной скорости обновления экрана sh, мы бы использовали CADisplayLink, а не Timer. Он работает так же, как таймер, но оптимально рассчитан на обновление экрана с оптимальной скоростью.

Несмотря на то, что стоит, идея обновления milliseconds для захвата истекшего времени немного не запускается. Мы никогда не обновляем «счетчик прошедшего времени», как это, потому что даже в лучшем случае ios частота не гарантируется. (И из-за ограничений в двоичных представлениях дробных десятичных значений, мы также редко хотим добавлять значения с плавающей запятой, подобные этой.)

Вместо этого, если мы хотим иметь максимально быстрые обновления в нашем пользовательском интерфейсе, мы бы сохранили время начала, запустили CADisplayLink и каждый раз, когда вызывался обработчик таймера, вычисляли истекшее время как разницу между текущим временем и временем начала.

Теперь, если вам действительно нужно очень точный таймер, это можно сделать, но вы должны увидеть Техническое примечание TN2169 , в котором показано, как создать высокоточный таймер. Но это скорее крайний случай.

0 голосов
/ 15 апреля 2020

Краткий ответ: Вы не можете этого сделать. В ОС iOS и Ma c таймеры запускаются при запуске приложения l oop и запускаются только тогда, когда приложение посещает главное событие l oop. Частота срабатывания таймера с коротким интервалом будет зависеть от того, сколько времени ваше приложение тратит на обработку события l oop. Как вы говорите, документы рекомендуют минимальный интервал около 1/50 секунды.

Вы можете использовать таймер CADisplayLink, который привязан к экрану refre sh. Эти таймеры должны работать быстро, чтобы не мешать работе вашего приложения.

Почему, по вашему мнению, вам нужен таймер, который срабатывает ровно каждую миллисекунду?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...