Введение в 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());    }} 

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



    Содержание раздела