Limitazione di framerate


9

La maggior parte dei motori di gioco competitive di successo come id Tech, GoldSrc, Sourcee tale consentono limitazioni framerate.

Puoi giocare con 30, con 60, con 99, con 72, con 68 ecc. In breve, puoi tapparlo e controllarlo.

Mi chiedevo, come posso limitare il framerate?

Non interessato al codice, ma alla teoria.


Solo per curiosità, qual è il punto in questo oltre a liberare i cicli per altri processi?
3Daveva il

1
@DavidLively, Pensa ai laptop, quelli si surriscaldano molto facilmente con un frame rate molto elevato, mentre con un limite di 60 fps (più è comunque inutile, anche 60 è un po 'troppo, 40 dovrebbero fare) possono controllare la temperatura molto meglio.

Per i giochi competitivi è meglio avere un frame rate uniforme invece di picchi tra 60 e 100 fps poiché a volte alcune azioni dipendono dal frame rate e non dipendono dal tempo, un frame rate uguale ti dà un'idea di queste azioni. Tuttavia, se abiliti VSync il tuo gioco ha sempre un fps massimo pari alla tua frequenza di aggiornamento perché (il driver se ne occupa).
Roy T.

Risposte:


7

La teoria è: controlla l'ultima volta che hai eseguito il rendering di un fotogramma e se non è ancora il momento di disegnare un altro fotogramma, allora non farlo e attendi fino a quando non lo è.


8

Supponiamo che tu voglia limitare il tuo framerate a 60fps, ciò significa che ogni fotogramma ha un tempo di rendering di 1 / 60s = 16,67ms (arrotondato)

Per limitare la frequenza dei fotogrammi, basta controllare il tempo all'inizio del ciclo di gioco, quindi è possibile confrontarlo con il tempo alla fine del ciclo di gioco: se la differenza è inferiore a 16,67 ms, è necessario bloccarsi per quel tempo.

Un modo per farlo è usare:

sleep(waittime)

Tuttavia, poiché sleep(x)restituisce il thread per un minimo di xmillisecondi, non si è certi se si otterrà il controllo indietro nel tempo.

Un modo migliore sarebbe usare:

while(timediff < 16.67ms){ sleep(0); }

Ciò restituisce il thread e richiede il controllo al più presto.

Un'altra soluzione è quella di avere solo un loop di attesa occupato, questo ti dà il miglior controllo ma usa la CPU inutilmente.

Ricorda che lo scheduler del sistema operativo può sempre togliere il controllo dal tuo thread, quindi preparati per alcune fluttuazioni.


"1/60" per essere chiari. :)
Richard Marskell - Drackir,

Questa soluzione è davvero pessima. Se hai attivato vsync o il sistema operativo decide di fare cose, il tuo framerate fluttuerà molto.
Tara,

@Dudeson Perché è male? (questa è la tecnica usata in Quake3 tra l'altro). Se il tuo FPS è inferiore a 60, il loop viene saltato. Quindi mantiene il tuo FPS il più alto possibile ma mai sopra i 60.
Roy T.

@RoyT. Interessante ... Da dove hai preso quelle informazioni? Dal codice sorgente? Inoltre, sto dicendo che aspettare in un ciclo è negativo perché è esattamente come l'ho fatto nel mio motore e mi provoca molto dolore. Il problema è che quando si attiva vsync (nel driver GPU) si ottengono molti frame frame se si tenta inoltre di limitare la frequenza dei fotogrammi nel codice, perché il timinig non sarà perfetto per ogni frame. Sto solo parlando di problemi vsync. Senza vsync questo non è un problema. E non sono sicuro che vsync fosse lo stesso tipo di affare nei giorni di Quake 3 di oggi.
Tara,

@Dudeson qualcun altro me lo ha fatto notare qualche tempo fa perché ero preoccupato per l'attesa e il sonno impegnato. Vedo ora che puoi fluttuare tra 30 fps e 60 fps quando v-sync è attivo se ti manca leggermente. Ma suppongo che ciò accada con qualsiasi tecnica (non è questo ciò che FreeSync cerca di alleviare). Un framerate limitato per codice o perché il tuo computer non è in grado di eseguire il rendering a 60fps avrà sempre questo problema, credo :)
Roy T.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.