[Precedente] Contenuti [Successivo]

Usare la Simple DirectMedia Layer API

I Timer

  • Ottenere il tempo attuale, in millisecondi

La funzione SDL_GetTicks() ritorna quanti millisecondi sono trascorsi da un punto arbitrario nel passato.

Suggerimento:
In generale, quando si scrive un gioco, e' meglio muovere gli oggetti in base al tempo, invece che in base al frame-rate. Questo fa si che la risposta (e quindi la giocabilita') sia migliore sia su sistemi lenti che su sistemi veloci.
Esempio:
#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);
}
  • Attesa di un numero specifico di millisecondi

La funzione SDL_Delay() permette di effettuare un attesa deterministica per un dato numero di millisecondi.

Dal momento che i sistemi operativi sui quali gira SDL sono tutti multi-tasking, non c'e' modo sicuro per garantire che l'applicazione attendera' esattamente per un dato tempo. Quindi, questo sistema dovrebbe essere usato piu' per fare in modo che l'applicazione si fermi per un po' di tempo, invece che per fare in modo che aspetti un preciso momento.

Suggerimento:
Molti sistemi operativi funzionano su 'blocchi' schedulati di circa 10 millisecondi. E' possibile usare SDL_Delay(1) per fare in modo che l'applicazione rilasci la CPU per il 'blocco' corrente, cosicche' altri thread possano essere eseguiti. Questo e' importante se si ha un thread in un loop stretto, ma non si vuole impedire l'esecuzione di altri thread che necessitano di un'attenzione continuata (come quelli che controllano l'audio).
Esempio:
{
    while ( game_running ) {
        UpdateGameState();
        SDL_Delay(TimeLeft());
    }
}
 

[Precedente] Contenuti [Successivo]