Android игра таймер: подсчет 10мс при работе на 60fps (16.66 МС)

Фон

Я разрабатываю игру для Android, в которой я добавляю режим «скорость» — здесь вместо высокого балла игроки будут пытаться выполнить задачу в самое быстрое время — чем меньше времени, тем выше они будут в таблице лидеров.

Вопрос

Теперь это игра, написанная на OpenGL ES 2.0 — она работает со скоростью 60 ТИКов в секунду (обновления логики игры) и визуализируется так быстро, как устройство может обрабатывать. Он использует фиксированное Дельта-время (1f/Ticks_Per_Second).

В принципе, каждый игровой ТИК происходит каждые 16.66 МС, но мне нужно подсчитать и отобразить стосекунды (10 мс) — как?

Если я держу переменную и говорю что-то вроде:

timePassed++; //Increase this each tick

Затем через 1 секунду (60 тиков), я бы только сосчитал до 60, я могу обойти это так:

timePassed+=1.666666666666667;

Теперь, после 1 секунды, timePassed = 100 (что в конечном итоге то, что я хочу). Затем я могу получить фактическое время в секундах путем деления на 100 и усечения до 2 десятичных знаков. (или просто используйте это как 100ths секунды и используйте отдельные переменные для секунд и минут). Каждый тик, я бы также сделать это изменение.

Проблема в том, что я всегда буду «пропускать» некоторые значения, потому что я обновляю только 60 раз в секунду, а не 100.

Системный таймер

Я также мог бы захватить время в Милли или нано секунд, а затем, когда игра заканчивается, захватить его снова и выяснить разницу, однако, я предвижу аналогичную проблему, потому что я только запрашиваю разницу каждые 60 секунд.

Аналогично, я мог бы запустить таймер в другом потоке, но, опять же, я бы только когда-либо запрашивал его в кратных 1/60-й секунды.

Надеюсь, что я объяснил проблему достаточно хорошо, если требуется дополнительная информация, пожалуйста, спросите.

1 ответ

  1. IMO первый подход не очень надежен, потому что вы подсчитываете кадры, а не время. Я бы использовал системный таймер и попытался отделить логику игры от рендеринга. Таким образом, вы будете иметь:
    Логика ядра — > произведите лидер-доску каждые 10мс>
    Рендеринг — > каждые 16 мс