Ограничение кадра - скорость

Вот код игрового цикла, который я внедрил в свое приложение для Android.

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

Я не могу решить, как также ограничить/ограничить рендеринг до фиксированного количества (скажем, 30 или около того FPS).

В частности, рендеринг должен выполняться только при обновлении логики, а не при рендеринге избыточных кадров (т. е. когда не произошло никакого обновления логики).

РЕДАКТИРОВАТЬ: я только что добавил часть кода интерполяции - может ли это быть причиной проблемы, когда я закрываю кадры, как рекомендовано @Geobits?

int TICKS_PER_SECOND = 30;
int SKIP_TICKS = 1000 / TICKS_PER_SECOND;
int MAX_FRAMESKIP = 10;

long next_game_tick = GetTickCount();
int loops;

bool game_is_running = true;
while( game_is_running ) {

    loops = 0;
    while( GetTickCount() > next_game_tick && loops < MAX_FRAMESKIP) {
        update_game();

        next_game_tick += SKIP_TICKS;
        loops++;
    }
    interpolation = float( GetTickCount() + SKIP_TICKS - next_game_tick )
                    / float( SKIP_TICKS );
    display_game( interpolation );
}

person Zippy    schedule 23.02.2013    source источник


Ответы (1)


Есть несколько способов ограничить частоту кадров, но если все, что вам нужно, это:

В частности, рендеринг должен выполняться только при обновлении логики, а не при рендеринге избыточных кадров (т. е. когда не произошло никакого обновления логики).

Тогда вы можете просто установить простой логический флаг. Установите значение true в update_game() и проверьте его в onDraw(). Если это ложь, просто вернитесь, не рисуя/очистив экран. Если это правда, сделайте свой рисунок и установите для него значение false;

person Geobits    schedule 23.02.2013
comment
Спасибо @Geobits, я реализовал это, и это работает (подтвержденный рендеринг и обновления игры происходят одинаковое количество раз в секунду), но это вызывает «рывки» моих спрайтов — у вас есть какие-либо идеи, что может быть причиной этого или как избежать? Это? Спасибо еще раз - person Zippy; 24.02.2013