|
[Назад]
Содержание
[Дальше]
Применение 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());
}
}
|
[Назад]
Содержание
[Дальше]
|