2012-09-12 6 views
12

Android utilizza la struttura RectF per il disegno di bitmap. Sto lavorando sulla mia struttura di gioco, quindi per esempio, avrà un Sprite e coordinate x/y, larghezza, altezza, velocità e così via. Ciò significa che ogni volta nel mio ciclo di rendering devo convertire questi numeri interi in float quando capisco i RectF di origine/destinazione da usare ... in alternativa, posso essere molto più universale e usare i float ovunque così che quando arriva il momento di simulare il fisica e render, tutti i tipi sono già dello stesso tipo ... anche se non è necessario per quale proprietà è (non ho bisogno di un float per "posizione x", ma dovrò lanciarlo durante il rendering se non).Per Android, dovrei usare il tipo di dati float più spesso per il mio gioco, o semplicemente lanciare il float quando disegno?

se i galleggianti in genere sono più inefficienti di 2-10x (per http://developer.android.com/guide/practices/performance.html), qual è la giusta direzione da prendere?

TLDL: Devo eseguire il cast di int su float, o semplicemente avere tutte le variabili che contribuiscono all'inizio, anche se i float sono inefficienti? Quanto è inefficiente un typecast?

+1

I forsee un periodo di tempo dedicato alla creazione di profili nel tuo prossimo futuro .... :) Per tutti vale la pena, i calcoli sui float sono lenti, così come il casting costante ... forse la profilazione mostra che è meglio per ti attacchi ai galleggianti piuttosto che cambiarli costantemente. – Shark

+0

L'unica risposta corretta è: prova sia con il benchmark. Dipende se i calcoli o il casting prevalgono. (O se uno dei due è davvero un problema, per cominciare.) – millimoose

+0

In molti casi, se non la maggior parte, semplicemente non si può evitare l'aritmetica in virgola mobile. Si noti inoltre che il collegamento fornito indica che l'aritmetica in virgola mobile può essere fino a 2 volte più lenta sui dispositivi senza FPU. La differenza di velocità 10 volte è menzionata come confronto tra due diversi dispositivi. – harism

risposta

5

Il modo migliore per eseguire questa operazione è eseguire i calcoli con il massimo grado di precisione richiesto per produrre i risultati previsti entro la tolleranza specificata. Ciò significa che se hai bisogno di usare il doppio per fare calcoli e ottenere i risultati attesi con coerenza, allora usali. Scopri dove meno precisione è accettabile e fai solo le operazioni che lo richiedono con float. Ricorda, il tuo mondo non deve approssimare la gravità terrestre per gli oggetti che cadono, puoi semplificare le cose e rendere la gravità 10 invece di 9.81, rendere i pixel corrispondenti alle unità pari, ecc. Aiuterà anche se definisci le tue costanti nella stesse unità ed evita di fare la conversione di unità per fare matematica (dato che questo si traduce in operazioni extra), è meglio aggiungere più costanti finali che hanno qualcosa come gravità in cm/s, m/s e km/h di quella di avere solo uno e convertirlo mille volte. Oh, e il costo di lanciare int per fluttuare non è molto alto rispetto alla moltiplicazione di 2 galleggianti, quindi pensaci.

Noterò anche che le FPU stanno diventando sempre più comuni nei moderni telefoni Android, e quindi il problema di usare la matematica in virgola mobile sta diventando un po 'meno importante (anche se non del tutto).

L'altra cosa che voglio notare è Double/Float/Integer vs. double/float/int. Il primo richiede che vengano creati nuovi oggetti da usare e che non dovrebbero essere usati per la matematica (quando possibile), mentre i secondi sono primitivi e non comportano la creazione di nuovi oggetti da utilizzare, ma sono meno costosi da creare.

+0

Grazie per scontato che: 'float a = 1.12f; int b = 2; float c = a + b; ' potrebbe essere peggiore o peggiore di ' float a = 1.12f; float b = 2; float c = a + b; ' – user11398

+0

http://gamasutra.com/view/news/165567/Indepth_Float_precision__From_zero_to_100_digits.php#.UFGZeK6tbZ8 – Shark

Problemi correlati