iPhone: разные системные таймеры?

До сих пор я использовал mach_absolute_time() для всех своих функций синхронизации. расчет времени между кадрами и т. д.

Теперь я хочу получить точное время, когда происходят события ввода касания, используя event.timestamp в обратных вызовах касания.

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

есть ли способ синхронизировать два разных таймера?

или в любом случае можно получить доступ к тому же таймеру, который сенсорный ввод использует для создания этого свойства временной метки? в противном случае это почти бесполезно.


person matt    schedule 12.04.2010    source источник


Ответы (3)


Сам с этим столкнулся. Хорошей документации не так много, поэтому я решил поэкспериментировать. Вот что мне удалось определить:

mach_absolute_time зависит от процессора устройства. Он возвращает тики с момента последней перезагрузки устройства (иначе известное как время безотказной работы). Чтобы получить его в удобочитаемой форме, вы должны изменить его на результат mach_timebase_info (коэффициент), который вернет миллиардные доли секунды (или наносекунды). Чтобы сделать это более удобным, я использую функцию, подобную приведенной ниже:

#include <mach/mach_time.h>

int getUptimeInMilliseconds()
{
 static const int64_t kOneMillion = 1000 * 1000;
 static mach_timebase_info_data_t s_timebase_info;

 if (s_timebase_info.denom == 0) {
  (void) mach_timebase_info(&s_timebase_info);
 }

 // mach_absolute_time() returns billionth of seconds,
 // so divide by one million to get milliseconds
 return (int)((mach_absolute_time() * s_timebase_info.numer) / (kOneMillion * s_timebase_info.denom));
}
person BadPirate    schedule 20.01.2011

Получите начальную разницу между двумя, т.е. то, что возвращается mach_absolute_time() изначально при запуске вашего приложения, а также получите метку event.timestamp изначально в то же время...

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

person Mihir Mehta    schedule 12.04.2010
comment
ммм, у меня болит мозг. Я не думаю, что это работает, хотя я вызывал mach_absolute_time() и сравнивал его с event.timestamp каждый раз, когда я получал обратный вызов ввода, и разница никогда не была одинаковой, меняясь довольно заметно. в конце концов, весь смысл метки времени должен был бы сообщить вам, когда событие действительно происходит, поэтому обратный вызов может быть вызван, когда когда-либо. поэтому разница во времени между тем, когда фактически происходит ввод, и когда фактически вызывается обратный вызов, и я могу вызвать mach_absolute_time, является полностью случайной и переменной. - person matt; 13.04.2010
comment
вы неправильно истолковали мой ответ... просто возьмите начальную разницу. - person Mihir Mehta; 13.04.2010

Как насчет CFAbsoluteTimeGetCurrent?

person zoul    schedule 12.04.2010