Сроки ошибки в нашей игре, currentTimeMillis замораживания?

При тестировании нашей игры, которая сильно зависит от System.currentTimeMillis() , мы испытываем раздражающую ошибку.

В нашей игре используется массив дельта-меток, который указывает, когда произойдут определенные вещи. Эти временные метки соответствуют музыкальной пьесе.

Тестирование дома не дает нам никаких проблем. Невозможно воспроизвести ошибку при тестировании из нашего дома.

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

Я пробовал вставлять фальшивую подсказку в игре, заставляя поток спать несколько секунд, когда я нажимаю определенную кнопку. Это замерзает экран (очевидно), но все еще прекрасно синхронизируется, когда сон закончился.

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

Вопрос, конечно,

  • Что с этим делать?

  • У кого-нибудь есть идеи?

Прочтите SystemClock .

System.currentTimeMillis () – это стандартные «стенные» часы (время и дата), выражающие миллисекунды с эпохи. Настенные часы могут быть установлены пользователем или телефонной сетью (см. SetCurrentTimeMillis (long)), поэтому время может скачкообразно переходить назад или вперед.


UptimeMillis () подсчитывается в миллисекундах с момента загрузки системы. Эти часы останавливаются, когда система переходит в глубокий сон (CPU выключен, отображается темно, устройство ожидает внешнего входа), но на него не влияют механизмы масштабирования часов, простоя или другие механизмы энергосбережения. Это является основой для большинства интервальных интервалов, таких как Thread.sleep (millls), Object.wait (millis) и System.nanoTime () . Эти часы гарантируют монотонность и подходят для интервальной синхронизации, когда интервал не охватывает режим сна.

Я думаю, что лучше использовать System.nanoTime () .