Несоответствие времени игрового цикла Android

Работаю над своей первой игрой :)

Это игра для Android, использующая libgdx и использующая модифицированный пример одного из цикла DeWiTTERS

Игровой цикл, кажется, отлично работает на рабочем столе (59–60 кадров в секунду), однако, когда я запускаю свой телефон, он имеет тенденцию находиться где-то в районе 75–90 кадров в секунду.

nextGameTick всегда должен ссылаться на 16 мс в будущем, чтобы игровой цикл работал со скоростью 60 кадров в секунду или меньше, почему это не так?

Вот основная часть игрового цикла для справки:

public void render() {
    nextGameTick = System.nanoTime() + skipTicks;
    loopTimeFull = System.nanoTime();

    Application app = Gdx.app;

    screen.update(app); // Update the screen
    screen.render(app); // Render the screen

    // when the screen is done we change to the
    // next screen
    if (screen.isDone()) {
        // dispose the current screen
        screen.dispose();
        <snip>
        // Removed unneded part of code for this example
        </snip>
        }
    }

    // Make the thread sleep
    General.renderTime = System.nanoTime() - loopTimeFull;
    while (System.nanoTime() <= nextGameTick - General.renderTime) {
        try {
            Thread.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    General.loopTime = System.nanoTime() - loopTimeFull;
    if (General.loopTime > 0)
        General.curFps = 1000000000 / General.loopTime;
    else
        Gdx.app.log("Air Offense", "General.loopTime == 0");

person Du-z    schedule 20.10.2011    source источник
comment
Не могли бы вы объяснить, какова цель General.curFps = 1000000000 / General.loopTime;?   -  person Mister Smith    schedule 20.10.2011
comment
@MisterSmith вот что вычисляет FPS, он делит количество наносекунд в секунду на время цикла в наносекундах   -  person Du-z    schedule 20.10.2011
comment
Я не знаю, является ли это причиной проблемы, но мне кажется плохой дизайн для сна в течение такого небольшого количества времени. Это примерно активное ожидание. Используемый вами метод Thread.sleep имеет параметр в мс. Также существует перегруженный метод, принимающий ns. Однако ни один из них не гарантирует, что он будет спать ровно определенное количество времени. Чтобы иметь большую точность, используйте Timer, чтобы засыпать точно требуемое количество ns за одно ожидание.   -  person Mister Smith    schedule 20.10.2011
comment
Взгляните на этот вопрос: stackoverflow.com/questions/5274619/   -  person Mister Smith    schedule 20.10.2011
comment
@MisterSmith Я успешно реализовал код в ссылке из вашего последнего комментария, спасибо. Что касается комментария, предшествующего этому, я рассмотрел использование таймеров неделю назад или около того, но я не смог найти способ реализовать его в libgdx, поскольку метод render() непрерывно зацикливается. также, как я могу дать вам отличный голос комментария? :п   -  person Du-z    schedule 20.10.2011
comment
Спасибо! При желании вы можете ответить на свой вопрос своим решением и пометить его как решенное, чтобы другие люди тоже могли извлечь из него уроки. Это очень интересный вопрос.   -  person Mister Smith    schedule 20.10.2011
comment
@MisterSmith, я не могу пометить его как решенный, потому что вы еще не ответили на вопрос; P   -  person Du-z    schedule 20.10.2011
comment
Отвечай сам! У меня сейчас мало времени XD. И вы могли бы поместить ссылку на этот другой вопрос о таймере, в комментариях он недостаточно заметен.   -  person Mister Smith    schedule 20.10.2011