Verwenden Sie beim Schreiben von Handyspielen Floats oder Doubles

8

Ich weiß, dass für Shader Schwimmer verwendet werden sollten, da sie die optimale Wahl für die Leistung sind. Doubles sind langsam und verbrauchen mehr Speicher, was für Shader nicht ideal ist. Während Floats weniger genau sind und zu Float-Überläufen neigen, ist der Kompromiss zwischen Geschwindigkeit und mobiler Hardware ideal.

Aber was ist mit allen anderen Stellen in der Codebasis, die nicht mit der Shader-Pipeline zusammenhängen? Ich schreibe eine Engine und verwende Doubles für das Delta-Update-Häkchen und versuche, alle Einheiten relativ zu diesem Datentyp zu halten, damit es viele Stellen gibt, an denen Doubles verwendet werden. Sollte ich im Motor auch Schwimmer auf Mobilgeräten verwenden?

Die Engine ist in C ++ geschrieben

Dan
quelle
Ich würde mir vorstellen, dass es weitgehend davon abhängt, welche Sprache Sie verwenden.
DJ Spicy Deluxe
C ++ in der Beschreibung hinzugefügt
Dan

Antworten:

14

Es wird Ihnen schwer fallen, eine mobile GPU zu finden, die auch dann Doppel-GPUs verwenden kann, wenn Sie möchten, sodass ein Teil der Auswahl für Sie getroffen wird.

Es gibt nur wenige Stellen, an denen Sie von einem Wechsel von Floats mit einfacher Genauigkeit in Ihrem Spiel profitieren können:

Dies sind die beiden häufigsten Beispiele für Dinge, die Sie nicht in einem Float mit einfacher Genauigkeit speichern sollten, da sie über den Bereich, den Sie abdecken müssen, erheblich an Genauigkeit verlieren (in der ersten Sekunde Ihres Spiels können Sie die verstrichenen Werte darstellen Zeit bis innerhalb von Sekunden oder zehn Nanosekunden, aber nach 2,5 Stunden verlieren Sie allmählich die Millisekundengenauigkeit.2- -24

Das bedeutet aber nicht, dass Sie unbedingt Doppel verwenden müssen. Ganzzahlige Typen können mit diesen Werten problemlos umgehen. (Mit einem 32-Bit-Int können Sie 12 Tage lang ununterbrochen Millisekunden genau spielen. 64-Bit-Ints halten Millionen von Jahren.)

Ein Delta- Zeitwert liegt normalerweise in der Größenordnung von 16 Millisekunden. Wenn Sie ihn also in einem Float mit einfacher Genauigkeit speichern, erhalten Sie eine Genauigkeit von etwa s, was immer noch auf das Niveau von Nanosekunden - dh. Wahrscheinlich weit über die Präzision hinaus, mit der Sie Ihren Code zuverlässig zeitlich festlegen, Ihre Threads signalisieren oder Ihre Grafikaktualisierung koordinieren können. Wenn Sie hier mit einem Double mehr Präzision hinzufügen, wird Ihr Spiel wahrscheinlich nicht messbar verbessert.2- -29

So können Sie Ihre gesamte verstrichene Zeit mit hoher Genauigkeit oder unter Verwendung eines Integer-Typs speichern, Ihr Delta berechnen und einmal pro Frame in Float mit einfacher Genauigkeit konvertieren und von da an problemlos Floats verwenden.

Ähnliches gilt für Positionen. Selbst in einer riesigen Welt können Schwimmer mit einfacher Genauigkeit eine Position relativ zu ihrem übergeordneten Teil mit einer Genauigkeit von weniger als einem Millimeter lokalisieren , wenn Sie sie in Stücke mit einem Durchmesser von mehreren Kilometern oder weniger aufteilen .

Relative Offsets zwischen Objekten (zum Berechnen von Überschriften und dergleichen) lassen sich im Allgemeinen auch in großen Entfernungen in einem Float speichern. Ihr relativer Fehler bleibt im Vergleich zur Gesamtlänge des Vektors in einem kontrollierten Bereich.

Es gibt also nicht viel Grund, sich standardmäßig dem Doppelten zuzuwenden. Ich würde das nur in Betracht ziehen, wenn Sie ein ganz besonderes Bedürfnis haben, bei dem Sie die Präzision von Floats berechnet haben, es nicht schneiden und Ihre Verwendung von Doppel nur für den Teil Ihres Spiels beibehalten, der es aktiv benötigt.

DMGregory
quelle