Come posso gestire il rendering su più monitor con frequenze di aggiornamento diverse?


8

Qual è il modo migliore per affrontare una situazione che potrebbe verificarsi, in cui un utente ha due o più monitor con risoluzioni diverse e intervalli di sincronizzazione verticale?

Ciò si applicherebbe quando un gioco ha un timestep fisso e funziona in modalità finestra: se un monitor ha una frequenza dei fotogrammi di 60.056 e l'altro ha una frequenza dei fotogrammi di 59.94, la sincronizzazione verticale alla fine non riuscirà a fare il suo lavoro, se il la finestra di gioco viene spostata dalla schermata principale a un'altra.

Aliasing temporale si verificherà anche, poiché il timestep non è correttamente in sintonia con l'altra frequenza di sincronizzazione. In che modo i giochi in genere affrontano questo problema, se non del tutto?


Che cosa è esattamente quello che stai cercando di fare?
Panda Pajama,

@PandaPajama Sto cercando di consentire al giocatore di spostare la finestra di gioco tra le schermate in modo uniforme in modo che A) non si verifichino strappi in qualsiasi punto e B) non vengano ripetuti fotogrammi in nessun punto. Immagino che la logica sia indipendente da quella, quindi ridurrò l'ambito della mia domanda al solo rendering.
NmdMystery,

Riceverai frame ripetuti solo se la tua logica di gioco funziona più lentamente del tuo codice di rendering. A 60 fps logici, a 60.056 fps grafici, in media otterrai un fotogramma ripetuto ogni 18 secondi. Ciò richiede 0,017 secondi e molto probabilmente sarà impercettibile. Se DEFINITAMENTE DEVI non avere frame ripetuti, puoi avere la tua logica di gioco a un framerate molto più veloce. Dì 200 fps. Sprecherai molta elaborazione e otterrai molti frame rilasciati, ma non otterrai frame ripetuti, il che sembra essere il tuo scopo.
Panda Pajama,

Questo è ovviamente valido per un mondo con fasi temporali discrete, che comprende la stragrande maggioranza del codice di gioco. Se riesci a calcolare costantemente lo stato del tuo mondo di gioco per un tempo arbitrario nin meno della O(n)complessità (in modo ottimale O(1)), allora non si applica nulla di ciò che ho detto. Tuttavia, le simulazioni interattive non funzionano in questo modo.
Panda Pajama,

Risposte:


5

I passaggi della logica di gioco non devono essere sincronizzati con la logica di visualizzazione, anche se si utilizza un timestep fisso.

Prendi in considerazione un gameloop come:

var time_per_step = 1 / 60 -- for 60 -logic- steps per second
var prev_time = get_time() -- in seconds

while true do
    var curr_time = get_time()
    while prev_time < curr_time do
        do_step()
        prev_time = prev_time + time_per_step
        // optional: curr_time = get_time()
    end
    draw()
end

Non importa quanto tempo draw()impiegano le chiamate. Finché do_step()impieghi meno di time_per_step, la logica di gioco non rimarrà indietro.


Che ne dici di strappare? È la soluzione a frequenze di aggiornamento diverse fino al fornitore o esiste un modo efficiente per eseguire il rendering al momento giusto su entrambi gli schermi senza sperimentare alias temporali su uno di essi?
NmdMystery,

Questa soluzione è compatibile con vSync. Ho usato 60 passaggi logici al secondo, ma puoi pompare su o giù quanto vuoi.
Panda Pajama,

Il mio punto è che con questo gameloop, la tua logica di gioco sarà sempre aggiornata con l'orologio in tempo reale. Pertanto, se la logica del tuo disegno non è esattamente in sincronia con la logica del gioco, questo algoritmo ripeterà o lascerà cadere i fotogrammi secondo necessità per tenere il passo con l'orologio in tempo reale. Se questo è accettabile o no dipende da te decidere
Panda Pajama,

Quindi devo scegliere tra fotogrammi ripetuti e lacerazioni, in sostanza? Nessuna altra alternativa?
NmdMystery

Bene, ma questo è per definizione. Se vuoi Xframe logici al secondo su Yframe grafici al secondo, per X != Y, dovrai fare in modo che la logica rimanga sulla grafica (fotogrammi ripetuti e rilasciati) o che la grafica rimanga sulla logica (strappo). L'altra alternativa è la logica della forza da eseguire a velocità grafica, che porterà all'alias temporale. Nessuna scienza missilistica qui.
Panda Pajama,
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.