UPS e FPS - Cosa devo limitare e perché?


11

Attualmente sto scrivendo un gioco usando C ++ e SDL2 e c'è una cosa che mi chiedo: ha senso limitare i miei frame al secondo (FPS) e / o i miei aggiornamenti al secondo (UPS)?

Ho l'idea che se limiti l'UPS, essenzialmente controlli la velocità del gioco - se il giocatore muove 1px per aggiornamento e lo aggiorni sempre 30 volte al secondo, si sposterà ad una velocità di 30px / se tu Probabilmente allevierà anche la CPU poiché diminuisce la quantità di calcoli al secondo. Se si limita l'FPS, la quantità di drawcall al secondo diminuisce, quindi si allevia la GPU. Spero di aver capito tutto correttamente, in caso contrario, sentiti libero di correggermi.

La mia domanda è: cosa dovrei limitare nel mio gioco? FPS? UPS? Entrambi? Nessuno dei due? C'è un altro approccio migliore a questo? Come viene fatto nella maggior parte dei giochi e perché?

Le risposte sono molto apprezzate!


2
Non proprio una risposta, ma potresti trovare questo utile: gafferongames.com/game-physics/fix-your-timestep
Cypher

Risposte:


10

Sì, ha senso.

Come hai detto, farà meno carico sul sistema, il che è buono per i termici e altre applicazioni.

Tuttavia .... La logica dei tuoi giochi NON dovrebbe dipendere dagli aggiornamenti al secondo. Pertanto ti consiglio di dare un'occhiata a deltatime, che renderà il tuo gioco indipendente dagli aggiornamenti al secondo.

Ti consiglio di dare un'occhiata a questa domanda. Spiega abbastanza bene come calcolarlo e usarlo. Come ottenere e utilizzare il delta time

Spero che abbia aiutato!


Quindi dovrei limitare entrambi o solo uno di essi?
DocCoock,

Entrambi, ma aggiungi un'opzione nelle impostazioni da regolare.
KaareZ,

5
Un avvertimento: se si utilizza un motore fisico, non fare affidamento su delta time / frame di aggiornamento variabile poiché questi sono raramente supportati; richiedono l'approccio del frame fisso. E se il tuo frame oscilla molto, questo potrebbe significare che hai problemi con il tuo software e dovresti chiederti perché questo accada. Dati questi, potresti riconsiderare l'utilizzo dell'approccio DT.
Vaillancourt

1
Si noti che l'utilizzo di aggiornamenti basati sul delta time può causare instabilità fisica e bug che sono molto difficili da riprodurre. In alcuni giochi, ci sono trucchi che sono possibili solo a determinati frame rate. Questo è il motivo per cui la fisica spesso gira a un frame rate fisso. Puoi sempre interpolare a velocità di aggiornamento inferiori, ma se la tua simulazione è instabile, nulla può aiutarti.
Dietrich Epp,

1
Onestamente, penso che il deltatime non sia una buona idea. L'ho usato per anni e viene fornito con due problemi principali. Molti articoli multiplayer diversi raccomandano di usare intervalli di tempo fissi per, e se il deltatime aumenta troppo, allora puoi teletrasportarti attraverso muri o bug simili a meno che tu non ne tenga conto.
Programmdude,

6

La migliore risposta è: dipende .

Non devi limitare nessuno dei due

Aggiornamenti : se gli aggiornamenti non sono vincolati a un limite superiore, la logica di gioco dovrebbe dipendere da un tempo delta , per evitare di eseguire il gioco più velocemente o più lentamente a seconda della macchina in cui viene eseguito. Questo è un approccio molto comune utilizzato da molti giochi, ma non è l'unico.

Rendering : se il rendering non è vincolato a un limite superiore, il framebuffer potrebbe essere presentato in uno stato incompleto o errato, causando artefatti laceranti . Questo è il motivo per cui molti giochi utilizzano la sincronizzazione verticale (v-sync)

Potresti limitare entrambi

Aggiornamenti : alcuni giochi utilizzano timestep fissi per alcuni o tutti i suoi sistemi di gioco. Questo approccio funziona esattamente come hai descritto. Il numero di aggiornamenti al secondo è limitato a un limite superiore per garantire che le cose non si muovano troppo velocemente su una macchina di prim'ordine. Questo elimina la necessità di delta timing. Alcune applicazioni sono migliori con timestep fissi, altre con delta timing. Scegliere quale approccio dipenderà interamente da ciò che esattamente stai cercando di raggiungere. Il libro online GameProgrammingPatterns ha un capitolo dedicato ai circuiti di gioco che tocca entrambe le architetture.

Rendering : i frame al secondo dovrebbero essere impostati su un limite superiore per evitare il problema di lacerazione sopra menzionato, tuttavia, l'applicazione non dovrebbe tentare di farlo manualmente con un blocco della CPU. Abilita invece v-sync e consenti all'hardware sottostante di sincronizzarsi con la frequenza di aggiornamento del monitor. In questo modo, il tuo gioco sarà compatibile con i futuri monitor che potrebbero operare su una frequenza molto più elevata rispetto ai 60Hz attualmente in uso. Vale anche la pena notare che molti giocatori, in particolare quelli nel benchmarking, preferiscono ancora correre senza v-sync per consentire il frame rate più alto possibile. Quindi è sensato consentire l'abilitazione o la disabilitazione della funzione durante il runtime.

Cosa non dovresti limitare

Se il tuo gioco utilizza un approccio basato sul polling per l'input dell'utente, ad esempio: chiama una getInput()sorta di aggiornamento degli stati del controller durante la fase di aggiornamento, questo è meglio se non limitato. O se limitato, impostare un limite superiore molto alto. Più spesso interroghi l'input dell'utente e agisci su di esso, più reattivo e fluido il gioco "sentirà". I cosiddetti giochi a 60Hz di cui sentiamo parlare oggigiorno non aggiornano l'intelligenza artificiale e tutti gli stati del mondo a quel ritmo, alcuni non lo rendono nemmeno così veloce, ma interrogano l'input del controller almeno 60 volte al secondo e aggiornano di conseguenza l'avatar del giocatore. Ammesso che questo sia davvero rilevante solo per i giochi d'azione frenetici.


Tuttavia, anche i miei aggiornamenti sono automaticamente limitati quando VSync è abilitato. Pertanto, a quanto pare, devo decidere tra il problema di lacrimazione e il problema di polling di aggiornamento, giusto?
DocCoock,

@DocCoock, se il renderer e la logica di gioco funzionano sullo stesso thread, sì, abilitando v-sync si corregge anche la frequenza di aggiornamento. Questo è uno dei motivi per cui alcuni giochi separano il rendering e la logica di gioco in thread diversi.
glampert

1

Ci sono due post che potresti voler dare un'occhiata:

Correggi il tuo timestep

Rendering fisico interpolato

Trovo le discussioni sui post davvero preziose, ma secondo me ha più senso quando c'è una quantità importante di simulazione fisica nel gioco. In sintesi, l'idea è che la simulazione dovrebbe avere una fase temporale fissa (altrimenti la fisica potrebbe esplodere in un punto in cui il delta è troppo grande), mentre il rendering dovrebbe avere la libertà di correre alla massima velocità possibile. Per sincronizzare entrambi (la simulazione e il rendering), lo stato di rendering è interpolato da un fattore che dipende dalla distanza della simulazione dal seguente aggiornamento (ricordare che la simulazione è fissa).

Spero che sia d'aiuto.

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.