Esiste un rischio reale di perdita di precisione nel tempo derivante dall'utilizzo di un galleggiante a precisione singola .
Manterrà comunque l'accuratezza al secondo più vicino per 97 giorni . Ma nei giochi ci preoccupiamo spesso della precisione nell'ordine della durata di un frame.
Un valore di tempo di galleggiamento a precisione singola in secondi inizia a perdere la precisione dei millisecondi dopo circa 9 ore .
Questo non è già al di fuori del regno delle possibilità per una singola sessione di gioco, o lasciare il gioco in esecuzione "AFK" mentre sei al lavoro / a scuola o dormendo. (Questo è uno dei motivi per cui un modo comune per testare un gioco è quello di eseguirlo durante la notte e verificare che continui a giocare correttamente al mattino)
Sulle console moderne, in cui i giochi vengono spesso sospesi e ripresi tra le sessioni di gioco anziché essere completamente chiusi, non è inaspettato che una "singola sessione" dal punto di vista del gioco superi le 9 ore di autonomia anche quando si gioca a raffiche brevi.
Supponendo che Unity deltaTime
sia calcolato da una fonte di tempo di maggiore precisione, che è confermata dagli esperimenti di Peter in un'altra risposta, fare affidamento su deltaTime
tempistiche su scala di fotogrammi è relativamente sicuro (basta essere cauti nell'accumulare durate molto lunghe sommando i deltaTime
valori - aggiungendo piccoli incrementi a un galleggiante più grande è una ricetta classica per la perdita di precisione, anche quando si compensa con algoritmi esperti .
Dal momento che fixedDeltaTime
mantiene lo stesso valore impostato, anziché cambiare dinamicamente da un fotogramma all'altro, puoi anche impostare un comportamento sensibile al tempismo in FixedUpdate per ottenere maggiori garanzie di coerenza. deltaTime
restituirà automaticamente il delta fisso appropriato in questi metodi. Mentre può esserci una frequenza di battuta tra aggiornamenti fissi e di frame, è possibile appianare questo attraverso l'interpolazione .
Quello che vuoi evitare è calcolare le durate sottraendo un timestamp da un altro . Dopo ore di gioco ciò può causare una cancellazione catastrofica, portando a una precisione molto minore di quella che si ottiene all'inizio della corsa. Se il confronto dei timestamp è importante per i tuoi sistemi, puoi generare il tuo valore temporale ad alta risoluzione usando altri metodi, come System.Diagnostics.Stopwatch
invece di Time.time
.