Какой самый эффективный способ реализации игрового таймера - PullRequest
3 голосов
/ 16 ноября 2011

Я пишу игру для iPhone.Когда пользователь делает свой первый ход, срабатывает таймер с интервалом 0,01 секунды.UILabel, отображающий время, также обновляется каждый раз.При тестировании на iPod touch 2-го поколения и iPhone 3GS я заметил, что iPod работал медленнее (через 20 секунд iPhone отобразил 00: 20,00, а iPod - ~ 00: 10,00).Есть ли способ сделать это более надежным?Если я прав, NSTimer должен работать в своем потоке ow и не должен блокироваться при взаимодействии с пользователем.

JNK

Ответы [ 3 ]

3 голосов
/ 16 ноября 2011

Документация NSTimer гласит:

Из-за различных источников входного сигнала Типичный цикл выполнения управляет, эффективное разрешение времени интервал для таймера ограничен порядка 50-100 миллисекунд. Если время срабатывания таймера цикл выполнения находится в режиме, который не мониторинг таймера или в течение длительного выноска, таймер не срабатывает до в следующий раз цикл выполнения проверяет таймер. Поэтому фактическое время в который может сработать таймер значительный период времени после запланированное время стрельбы.

Таким образом, точность может составлять 0,1, а не 0,01 секунды. Не говоря уже о том, заблокирован ли ваш поток по какой-либо причине. Так что, если ваше время увольнения имеет решающее значение, вы должны смотреть на другие вещи. Прочитайте это ТАК сообщение для начала. У Apple был пример кода метронома (в котором, очевидно, время имеет решающее значение), но я не могу найти его сейчас.

В любом случае, если вы используете таймер с NSTimer, вы должны записать время запуска. Затем, всякий раз, когда вы обновляете свой интерфейс, просто принимайте разницу текущего времени и вашего времени начала (с NSDates).

0 голосов
/ 16 ноября 2011

Вы не можете полагаться на таймер для точного запуска с указанными временными интервалами , поэтому отображаемое время всегда должно рассчитываться с учетом разностей временных интервалов. И я сомневаюсь, что таймер на iPhone может работать каждые 1 мс, в Кварце можно получать вызов таймера каждые 16 мс или около того, делая 60 кадров в секунду - поэтому планирование его на 1 мс, вероятно, означает, что « будет запущен, как только возможно", который может сильно отличаться на разных аппаратных средствах.

0 голосов
/ 16 ноября 2011

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

извините, я не знаком с вашим языком

...