2010-05-08 3 views
5

In che modo XNA mantiene un frame rate di 60 FPS coerente e preciso? Inoltre, come mantiene una tempistica così precisa senza ancorare la CPU al 100%?Come funziona la temporizzazione XNA?

+1

In genere mi piacerebbe sapere come fa qualsiasi cosa normale. –

risposta

2

Non so in modo specifico come XNA lo fa, ma quando ho giocato con OpenGL qualche anno fa ho realizzato la stessa cosa usando un codice molto semplice.

al centro di esso presumo che XNA abbia una sorta di ciclo di rendering, può o non può essere integrato con un ciclo di elaborazione uniforme standard ma, per fare un esempio, lascia supporre che non lo sia. in questo caso potresti scrivere qualcosa del genere.

TimeSpan FrameInterval = TimeSpan.FromMillis(1000.0/60.0); 
DateTime PrevFrameTime = DateTime.MinValue; 
while(true) 
{ 
    DateTime CurrentFrameTime = DateTime.Now; 
    TimeSpan diff = DateTime.Now - PrevFrameTime; 
    if(diff < FrameInterval) 
    { 
     DrawScene(); 
     PrevFrameTime = CurrentFrameTime; 
    } 
    else 
    { 
     Thread.Sleep(FrameInterval - diff); 
    } 
} 

In realtà si sarebbe probabilmente usare qualcosa di simile Environment.Ticks invece di DateTimes (sarebbe più preciso), ma penso che questo illustra il punto. Questo dovrebbe chiamare drawScene solo circa 60 volte al secondo, e il resto del tempo il thread dormirà in modo da non incorrere in alcun tempo di CPU.

+0

Ma usando Thread.Sleep, non dipende dalla programmazione dei thread? Ciò sembra essere leggermente prevedibile al meglio. Questo è quello che mi ha fatto chiedere come siano così coerenti. – redman

+0

l'uso del thread sleep ti lascia in balia dello scheduler, ma a lungo andare dovrebbe andare mediamente abbastanza bene, specialmente dopo 60 frame in un secondo. Quando si tratta di cronometraggio ad alta precisione su un computer, si è comunque in balia dello scheduler, perché il thread può sempre essere sostituito in qualsiasi momento. – luke

0

i giochi devono essere eseguiti a 60 fps ma ciò non significa che lo faranno. Questo è in realtà un limite massimo per un gioco rilasciato.

Se si esegue un gioco in modalità di debug, è possibile ottenere fotogrammi molto più elevati al secondo, ad esempio un modello di avvio vuoto sul mio laptop in modalità di debug funziona oltre 1.000 fps.

Detto questo, il framework XNA in un gioco rilasciato farà del suo meglio per funzionare a 60fps, ma il codice che hai incluso nel tuo progetto ha la possibilità di abbassare quella performance. Ad esempio, se qualcosa ha costantemente sparato alla garbage collection normalmente vedresti un tuffo nei fps del gioco, o lancerai dei complessi calcoli matematici nell'aggiornamento o nei metodi di disegno, facendo in modo che sparassero ogni frame ... che di solito sarebbe un po 'eccessivo. Ci sono un certo numero di cose da tenere a mente per mantenere il gioco il più semplice possibile.

Se stai chiedendo come il quadro XNA rende possibile quel limite - che non posso davvero spiegare - ma posso dire che a seconda di come si impagina il codice - e cosa si può fare può sicuramente avere un impatto negativo su questo numero, e non deve sempre essere correlato alla CPU. Nell'istanza di Garbage Collection è solo la pulizia di una RAM che potrebbe non mostrare alcun picco nell'utilizzo della CPU, ma potrebbe avere un impatto sul FPS, a seconda della quantità di spazzatura e dell'intervallo che deve eseguire.

+0

Ci si sbaglia in alcune cose in questa risposta ... la modalità di debug causa un sovraccarico in più, non di meno. Non è "casuale" che il codice rallenti le prestazioni; lo sarà sempre. La garbage collection ha sempre un impatto sulla CPU, periodo. –

4

Mentre il codice di Luca di cui sopra è diritto teorico i metodi e le proprietà utilizzate non sono le scelte migliori:

La corrente XNA FX sembra agganciare nel ciclo di messaggi di Windows ed eseguire la sua pre-aggiornamento interno ogni passo e chiamando Game.Update solo se il tempo trascorso dall'ultimo aggiornamento corrisponde al framerate specificato (ad es. ogni 16 ms per le impostazioni predefinite). Se vuoi veramente sapere come funziona XNA FX il tuo lavoro Reflector è tuo amico :)

Random tidbit: Back in XNA GameStudio 1.0 Periodo di tempo Alpha/Beta ci sono stati alcuni post sul blog "perfetto loop di gioco di WinForms", anche se non riesco a trovarli ora ...

0

Puoi leggere tutto su come è stato implementato il timer XNA qui Game timing in XNA Game Studio ma fondamentalmente proveremmo per 1/60 di secondo prima di riprendere il ciclo, inoltre notate che l'aggiornamento può essere chiamato più volte prima di un rendering se XNA ha bisogno di "recuperare".