Usa float o double quando scrivi giochi per dispositivi mobili


8

So che per gli shader, i float dovrebbero essere usati perché sono la scelta ottimale per le prestazioni. I doppi sono lenti e usano più memoria che non è l'ideale per gli shader. Mentre i float sono meno precisi e sono inclini a deflussi di float, il compromesso per la velocità è l'ideale per l'hardware mobile.

Ma che dire di qualsiasi altra parte della base di codice non correlata alla pipeline di shader? Sto scrivendo un motore e uso i doppi per il segno di spunta dell'aggiornamento delta e provo a mantenere tutte le unità relative a quel tipo di dati, quindi ci sono molti posti che usano i doppi. Dovrei usare anche i float sul cellulare nel motore?

Il motore è scritto in linguaggio C ++


Immagino che dipenda in gran parte dalla lingua che stai usando.
DJ Spicy Deluxe,

Aggiunto C ++ nella descrizione
Dan,

Risposte:


14

Ti sarebbe difficile trovare una GPU mobile che potrebbe usare i doppi anche se lo desideri, quindi quella parte della scelta è praticamente fatta per te.

Ci sono solo alcuni posti in cui potresti trarre vantaggio dal passaggio da float a precisione singola nel tuo gioco:

Questi sarebbero i due esempi più comuni di cose che non dovresti provare a memorizzare in un float a precisione singola, perché perdono una precisione significativa nell'intervallo che devi coprire (nel primo secondo del gioco, puoi rappresentare il tempo trascorso tempo dentro 224 secondi o decine di nanosecondi, ma dopo 2,5 ore inizi a perdere la precisione dei millisecondi)

Ma ciò non significa che devi necessariamente usare i doppi. I tipi interi possono gestire bene questi valori. (Un int a 32 bit può darti una precisione di millisecondi per 12 giorni di riproduzione continua. Gli ints a 64 bit durano milioni di anni)

Un valore delta time sarà in genere dell'ordine di 16 millisecondi, quindi memorizzarlo in un singolo float di precisione ti dà precisione a circa229s, che è ancora fino al livello di nanosecondi - cioè. probabilmente ben oltre la precisione con cui è possibile cronometrare in modo affidabile il codice, segnalare i thread o aggiornare la grafica in ogni caso. L'aggiunta di maggiore precisione qui con un doppio è improbabile che possa migliorare il tuo gioco in qualsiasi modo misurabile.

In questo modo è possibile memorizzare il tempo trascorso totale ad alta precisione o utilizzando un tipo intero, calcolare il delta e convertirlo in float a precisione singola una volta per fotogramma, quindi utilizzare i float felicemente da lì in poi.

Allo stesso modo per le posizioni. Anche con un mondo enorme, se lo si divide in blocchi di diversi km di diametro o meno, i singoli galleggianti di precisione possono localizzare una posizione relativa al suo blocco padre con una precisione inferiore a un millimetro .

Gli offset relativi tra oggetti (per calcolare le intestazioni e simili) sono generalmente perfetti per essere archiviati in un galleggiante anche a distanze immense. Il tuo errore relativo, rispetto alla lunghezza totale del vettore, rimane in un intervallo controllato.

Quindi, non ci sono molte ragioni per passare ai doppi come impostazione predefinita. Lo prenderei in considerazione solo se hai un'esigenza molto particolare, in cui hai calcolato che la precisione dei float non la taglierà, e manterrai il tuo uso dei doppi solo nella parte del tuo gioco che ne ha bisogno attivamente.

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.