[Назад] Содержание [Дальше]

Использование Simple DirectMedia Layer API

Использование таймеров

  • Получение текущего времени в миллисекундах 

SDL_GetTicks() говорит, сколько миллисекунд прошло с произвольно выбранного момента. 

Совет:
В основном, когда пишутся игры, оптимальным вариантом является движение объектов, основанное на времени (чем на количестве кадров). То есть, при очередном проходе по циклу следует смещать объект не на какое-то постоянное значение, а на значение, пропорциональное прошедшему с последнего прохода по циклу времени. Это позволит держаться игре с постоянной скоростью как на мощных, так и на слабых машинах. 

 

Пример

#define TICK_INTERVAL    30
 
Uint32 TimeLeft(void)
{
    static Uint32 next_time = 0;
    Uint32 now;
 
    now = SDL_GetTicks();
    if ( next_time <= now ) {
        next_time = now+TICK_INTERVAL;
        return(0);
    }
    return(next_time-now);
}

 

  • Задержка 

Функция SDL_Delay() позволяет установить задержку на какое-то количество миллисекунд. 

Поскольку ОС, поддерживающие SDL, в большинстве своем многозадачные, вызов это функции не дает гарантии, что программа задержится ровно на данное время! Чаще эта функция просто вызывается для небольшой задержки. 

Совет:
Большинство ОС имеют планировщик временных участков с интервалом около 10 миллисекунд. Вы можете использовать SDL_Delay(1) как способ оставить CPU текущий временной участок, позволив выполниться остальным потокам. Так чаще всего делают, когда необходимо выпонять свой поток в быстром непрерывном цикле, но также необходимо, чтобы и другие потоки (например, аудио) тоже выполнялись.

 

Пример:

{
    while ( game_running ) {
        UpdateGameState();
        SDL_Delay(TimeLeft());
    }
}
 

[Назад] Содержание [Дальше]