Введение в Simple DirectMedia Layer


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


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

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());    }} 

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




- Начало -  - Назад -  - Вперед -