Di recente ho letto questo articolo su Game Loops: http://www.koonsolo.com/news/dewitters-gameloop/
E l'ultima implementazione consigliata mi sta confondendo profondamente. Non capisco come funzioni e sembra un casino completo.
Comprendo il principio: aggiorna il gioco a una velocità costante, con tutto ciò che rimane renderlo il gioco il più volte possibile.
Presumo che tu non possa usare un:
- Ottieni input per 25 tick
- Rendering del gioco per 975 tick
Approccio poiché otterresti input per la prima parte della seconda e questo sembrerebbe strano? O è quello che sta succedendo nell'articolo?
Essenzialmente:
while( GetTickCount() > next_game_tick && loops < MAX_FRAMESKIP)
Com'è valido?
Assumiamo i suoi valori.
MAX_FRAMESKIP = 5
Supponiamo next_game_tick, che è stato assegnato pochi istanti dopo l'inizializzazione, prima che il ciclo di gioco principale sia ... 500.
Infine, poiché sto usando SDL e OpenGL per il mio gioco, con OpenGL usato solo per il rendering, supponiamo che GetTickCount()
ritorni il tempo da quando è stato chiamato SDL_Init, cosa che fa.
SDL_GetTicks -- Get the number of milliseconds since the SDL library initialization.
Fonte: http://www.libsdl.org/docs/html/sdlgetticks.html
L'autore assume anche questo:
DWORD next_game_tick = GetTickCount();
// GetTickCount() returns the current number of milliseconds
// that have elapsed since the system was started
Se espandiamo la while
dichiarazione otteniamo:
while( ( 750 > 500 ) && ( 0 < 5 ) )
750 perché il tempo è passato da quando è next_game_tick
stato assegnato. loops
è zero come puoi vedere nell'articolo.
Quindi abbiamo inserito il ciclo while, facciamo un po 'di logica e accettiamo alcuni input.
Yadayadayada.
Alla fine del ciclo while, che ti ricordo che è all'interno del nostro ciclo di gioco principale è:
next_game_tick += SKIP_TICKS;
loops++;
Aggiorniamo l'aspetto della prossima iterazione del codice while
while( ( 1000 > 540 ) && ( 1 < 5 ) )
1000 perché è trascorso il tempo a ottenere input e fare cose prima che raggiungessimo la successiva ineterazione del loop, in cui viene richiamato GetTickCount ().
540 perché, nel codice 1000/25 = 40, quindi, 500 + 40 = 540
1 perché il nostro loop è stato ripetuto una volta
5 , sai perché.
Quindi, dal momento che questo ciclo While è chiaramente Dipendente MAX_FRAMESKIP
e non intenzionale, TICKS_PER_SECOND = 25;
come dovrebbe funzionare correttamente il gioco?
Non è stata una sorpresa per me che quando l'ho implementato nel mio codice, potrei aggiungere correttamente, semplicemente rinominando le mie funzioni per gestire l'input dell'utente e disegnare il gioco su ciò che l'autore dell'articolo ha nel suo codice di esempio, il gioco non ha fatto nulla .
Ho inserito un fprintf( stderr, "Test\n" );
ciclo while che non viene stampato fino alla fine del gioco.
In che modo questo ciclo di gioco viene eseguito 25 volte al secondo, garantito, mentre il rendering è il più veloce possibile?
Per me, a meno che non mi manchi qualcosa di ENORME, sembra ... niente.
E non è questa struttura, di questo ciclo while, presumibilmente in esecuzione 25 volte al secondo e quindi aggiornare il gioco esattamente quello che ho menzionato prima all'inizio dell'articolo?
In questo caso, perché non potremmo fare qualcosa di semplice come:
while( loops < 25 )
{
getInput();
performLogic();
loops++;
}
drawGame();
E conta per l'interpolazione in qualche altro modo.
Perdona la mia domanda estremamente lunga, ma questo articolo ha fatto più male che bene a me. Sono gravemente confuso ora - e non ho idea di come implementare un ciclo di gioco adeguato a causa di tutte queste domande sorte.