Utilisez des flotteurs ou des doubles lors de l'écriture de jeux mobiles

8

Je sais que pour les shaders, les flotteurs doivent être utilisés car ils sont le choix optimal pour la performance. Les doubles sont lents et utilisent plus de mémoire, ce qui n'est pas idéal pour les shaders. Alors que les flotteurs sont moins précis et sont sujets à des débordements de flotteurs, le compromis pour la vitesse est idéal sur le matériel mobile.

Mais qu'en est-il partout ailleurs dans la base de code sans rapport avec le pipeline de shaders? J'écris un moteur et j'utilise des doubles pour la mise à jour delta et j'essaie de garder toutes les unités par rapport à ce type de données, donc il y a beaucoup d'endroits qui utilisent des doubles. Dois-je également utiliser des flotteurs sur mobile dans le moteur?

Le moteur est écrit en langage C ++

Dan
la source
J'imagine que cela dépend en grande partie de la langue que vous utilisez.
DJ Spicy Deluxe
Ajout de C ++ dans la description
Dan

Réponses:

14

Vous auriez du mal à trouver un GPU mobile qui pourrait utiliser des doubles même si vous le vouliez, de sorte qu'une partie du choix est à peu près faite pour vous.

Il n'y a que quelques endroits où vous pourriez bénéficier de la transition des flotteurs simple précision dans votre jeu:

Ce sont les deux exemples les plus courants de choses que vous ne devriez pas essayer de stocker dans un flotteur simple précision, car elles perdent une précision significative sur la plage que vous devez couvrir (dans la première seconde de votre jeu, vous pouvez représenter le temps écoulé temps à l'intérieur 2-24 secondes ou dizaines de nanosecondes, mais au bout de 2,5 heures, vous commencez à perdre la précision en millisecondes)

Mais cela ne signifie pas que vous devez nécessairement utiliser des doubles. Les types entiers peuvent très bien gérer ces valeurs. (Un int 32 bits peut vous donner une précision en millisecondes pendant 12 jours de jeu continu. Les entiers 64 bits dureront des millions d'années)

Une valeur de temps delta sera généralement de l'ordre de 16 millisecondes, donc le stocker dans un flotteur de précision unique vous donne une précision d'environ2-29s, qui est encore au niveau des nanosecondes - ie. probablement bien au-delà de la précision avec laquelle vous pouvez chronométrer votre code de manière fiable, signaler vos threads ou coordonner votre rafraîchissement graphique de toute façon. Ajouter plus de précision ici avec un double est peu susceptible d'améliorer votre jeu de manière mesurable.

Vous pouvez donc stocker votre temps total écoulé avec une grande précision ou en utilisant un type entier, calculer votre delta et le convertir en flottant simple précision une fois par image, puis utiliser les flotteurs avec plaisir à partir de là.

De même pour les postes. Même avec un monde immense, si vous le divisez en morceaux de plusieurs kilomètres ou moins, les flotteurs à simple précision peuvent localiser une position par rapport à son morceau parent avec une précision inférieure au millimètre .

Les décalages relatifs entre les objets (pour le calcul des titres et similaires) sont généralement très bien pour être stockés dans un flotteur, même à des distances immenses. Votre erreur relative, par rapport à la longueur totale du vecteur, reste dans une plage contrôlée.

Il n'y a donc pas beaucoup de raisons de se tourner vers le double par défaut. Je considérerais cela uniquement si vous avez un besoin très particulier, où vous avez calculé la précision des flotteurs ne le coupera pas, et gardez votre utilisation des doubles limitée à la partie de votre jeu qui en a activement besoin.

DMGregory
la source