2010-01-29 5 views
7

Nel mio libro OpenGL, si dice questo:FPS come si calcola questo?

"Quello che spesso accade su un tale sistema è che il telaio è troppo complicato per disegnare in 1/60 di secondo, in modo che ogni frame viene visualizzato più di una volta. Se, per esempio , ci vuole 1/45 di secondo per disegnare una cornice, si ottengono 30 fps e la grafica è inattiva per 1/30 1/45 = 1/90 di secondo per fotogramma o un terzo di tempo."

Nella frase che dice "ci vuole 1/45 di secondo per disegnare una cornice, si ottengono 30 fps", perché ottengo solo 30 fps? Woudln't 45 fps essere più corretto?

+0

scusa ragazzi, non lo capisco ancora, per favore dammi più risposte con una grande spiegazione! davvero non capisco ancora perché ottengo solo 30 fps, e perché questo richiede 2/60 secondi per aggiornare! (link anon ha detto), grazie ancora !! – drigoSkalWalker

risposta

12

La scheda grafica in genere bufferizza solo un fotogramma in avanti.

Se è necessario 1/45 di secondo per disegnare una cornice, quindi al 1/60 di secondo, il riquadro precedente verrà visualizzato di nuovo. Al segno 1/45, il fotogramma successivo è fatto - ma la carta non ha un buffer libero per avviare il rendering del prossimo, quindi deve restare inattivo fino a 1/30, dove può inviare quel frame e iniziare a lavorare sul prossimo.

Questo è abilitato per VSync - se lo si disabilita, invece di ottenere il framerate di 30FPS e una carta inattiva per 1/3 del tempo, la scheda inizierà a ridisegnare immediatamente, e si otterrà invece lo strappo dello schermo.

+1

+1: per riferimento V-sync –

+0

perché questo deve attendere fino a 1/30? grazie in adavance. – drigoSkalWalker

+0

Perché è quando viene inviato il fotogramma successivo (2/60 di secondo). Se disabiliti VSync, eviti l'attesa, ma poi l'immagine che la scheda invia sarà parte di un frame e parte di un altro. –

5

È corretto. Avresti ottenuto 45 fps, ma il sistema sta rallentando fino a 30 fps, per ottenere un framerate fluido su monitor da 60Hz (60 ridisposti al secondo).

Poiché è necessario disegnare qualcosa ogni 1/60 secondi su un monitor 60 Hz, e non può disegnare una "mezza-frame", è necessario disegnare il precedente telaio . Quindi se 60 volte al secondo disegnate una volta il frame reale, e ogni 2 fotogrammi che disegnate il primo, otterrete 30 fps nonostante il fatto che potreste gestire 45fps.

+0

60 volte/secondo, non ogni 60 secondi –

+0

@Jeffrey, ah, corretto errore di battitura, grazie –

0

Quindi sì, come altri hanno detto, questo è dovuto alla tua grafica in attesa di v-sync prima di iniziare a generare il fotogramma successivo.

Detto questo ...

attenzione, non tutti i monitor aggiornare a 60Hz. 60fps vs 30fps diventa 70fps vs 35fps su un display a 70Hz.

Se non si desidera che la scheda attenda la sincronizzazione v prima di iniziare il fotogramma successivo, ma evitare comunque la rottura, utilizzare il buffer triplo. La GPU quindi ping-pongs esegue il rendering a 2 buffer mentre viene visualizzata la terza. L'evento v-sync è ciò che attiva lo swap nel buffer back "correntemente finito". Questo non è ancora molto bello, perché ti ritrovi con alcuni fotogrammi che rimangono sullo schermo più spesso di altri: con il tuo rendering di 1/45, una cornice rimarrà per 1/30 e la successiva per 1/60, dando qualche scatto .

Infine, con l'avvento del rendering fuori schermo (rendering su buffer non visualizzati), è in teoria possibile che un driver non attenda il v-sync prima di iniziare sul fotogramma successivo, se il lavoro precedente di quello successivo il telaio capita di non toccare la superficie del display. Non penso di aver mai visto un pilota così intelligente.