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

Использование 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());     } }  

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