È sicuro usare la funzione Sleep () su Windows nel game loop (C ++)? Voglio avere un frame rate fisso.
È sicuro usare la funzione Sleep () su Windows nel game loop (C ++)? Voglio avere un frame rate fisso.
Risposte:
No non lo è. Il sonno garantisce solo un tempo minimo per dormire, ma può effettivamente dormire per qualsiasi periodo di tempo arbitrario durante quello. La risoluzione del timer (impostata tramite timeBeginPeriod) è anche importante per questo, e anche se stai usando qualcos'altro (come QueryPerformanceCounter) per il tuo timer, hai ancora bisogno di timeBeginPeriod per controllare la sospensione.
Quindi in sintesi:
L'unico caso ragionevole per l'utilizzo di Sleep sarebbe se si desidera ridurre l'utilizzo della CPU, ad esempio per i dispositivi mobili. Anche allora useresti Sleep (1); usarlo per controllare i framerate non è la strada da percorrere.
Forzare vsync è probabilmente un modo comune per ottenere un framerate fisso, ma anche in questo caso hardware diverso verrà eseguito a frequenze di aggiornamento diverse e non sarà possibile avere un framerate fisso coerente su macchine diverse (questo dipende dal tipo di hardware stai prendendo di mira ovviamente).
A questo punto è necessario menzionare questo articolo: Gaffer On Games - Fix Your Timestep! . Descrive i passaggi necessari per ottenere un timestep coerente nella simulazione.
Risposta breve: no, non lo è.
Per avere un frame rate fisso devi chiamare una certa funzione di callback che forza un frame rate specifico. Ovviamente, se non si impiega ora una singola iterazione in un ciclo, non è possibile impostare un tempo di sospensione fisso.
GLUT fornisce glutTimerFunc () , che è, se stai programmando in OpenGL, la giusta funzione di cui hai bisogno. Dai un'occhiata a questo esempio o a questo .
Sleep
?