Gleitkomma oder Festkomma für Android NDK OpenGL-Anwendungen?

8

Ich versuche zu entscheiden, ob ich in erster Linie Floats oder Ints für alle 3D-Elemente in meiner App verwenden soll (was meistens C ++ ist). Ich verstehe, dass die meisten ARM-basierten Geräte keine Hardware-Gleitkomma-Unterstützung haben, daher denke ich, dass jedes schwere Heben mit Floats merklich langsamer wäre.

Ich plane jedoch, alle Daten größtenteils vorzubereiten (d. h. haben Vertex-Puffer, wo anwendbar, und transformieren sie unter Verwendung von Matrizen, die sich nicht viel ändern), so stopfe ich nur Daten in OpenGLs Hals. Kann ich davon ausgehen, dass dies mehr oder weniger direkt an die GPU geht und als solche relativ schnell geht? (Btw, die Mindestanforderung ist OpenGL ES 2.0, so dass vermutlich ältere 1.x-basierte Telefone ausgeschlossen werden.)

Auch - wie ist die Strafe, wenn ich Ints und Floats mische? Angenommen, alle meine Geometrie sind nur vordefinierte Float-Puffer, aber ich benutze Ints für Matrizen, da diese teure Operationen wie Matrix-Multiplikationen erfordern, wie viel Zorn werde ich hier entstehen lassen?

Übrigens, ich weiß, dass ich meine Erwartungen niedrig halten sollte (klingt, als würde man sogar nach Floats auf der CPU fragen, fragt nach zu viel), aber gibt es etwas Entferntes wie 128-Bit-VMX-Register?

(Und ich hoffe heimlich, dass Fadden diese Frage liest und eine tolle Antwort hat.)

    
EboMike 02.08.2010, 07:54
quelle

2 Antworten

14

Ältere Android-Geräte wie G1 und MyTouch verfügen über ARMv6-CPUs ohne Gleitkommaunterstützung. Die meisten neueren Geräte wie Droid, Nexus One und Incredible verwenden ARMv7-A-CPUs mit FP-Hardware. Wenn Ihr Spiel wirklich 3D-intensiv ist, könnte es mehr von der 3D-Implementierung verlangen, als die älteren Geräte ohnehin bieten können. Sie müssen also entscheiden, welche Hardware Sie unterstützen möchten.

Wenn Sie ausschließlich in Java codieren, nutzt Ihre App die FP-Hardware, wenn sie verfügbar ist. Wenn Sie nativen Code mit dem NDK schreiben und die armv5te-Architektur auswählen, erhalten Sie überhaupt keine Hardware FP. Wenn Sie die Architektur von armv7-a auswählen, werden Sie das tun, aber Ihre App wird nicht auf Geräten vor ARMv7-A verfügbar sein.

OpenGL von Java sollte jetzt auf "direkten" Byte-Puffern sitzen, auf die derzeit nur langsam von Java zugegriffen werden kann, aber sehr schnell von der nativen Seite. (Ich weiß jedoch nicht viel über die GL-Implementierung, also kann ich nicht viel mehr anbieten.)

Einige Geräte unterstützen zusätzlich die NEON- "Advanced SIMD" -Erweiterung, die einige ausgefallene Funktionen bietet, die über die grundlegende VFP-Unterstützung hinausgehen. Allerdings müssen Sie dies zur Laufzeit testen, wenn Sie es verwenden möchten (es sieht jetzt so aus, als wäre hier ein Beispielcode - siehe NDK-Seite für NDK r4b).

Eine frühere Antwort hat einige Informationen über den gcc Flags, die vom NDK für "hard" fp verwendet werden.

Letztendlich hängt die Antwort auf "fixed or float" davon ab, auf welcher Geräteklasse die App ausgeführt werden soll. Es ist sicherlich einfacher, für armv7-a zu codieren, aber Sie schneiden sich von einem Stück des Marktes ab.

    
fadden 02.08.2010, 22:39
quelle
5

Meiner Meinung nach sollten Sie so viel wie möglich am Fixpunkt bleiben.

Nicht nur alte Telefone vermissen die Gleitkommaunterstützung, sondern auch neue wie das HTC Wildfire.

Wenn Sie sich für ARMv7 entscheiden, beachten Sie bitte, dass zum Beispiel das Motorola Milestone (Droid für Europa) eine ARMv7-CPU besitzt, aber aufgrund der Art und Weise, wie Android 2.1 für dieses Gerät gebaut wurde, wird das Gerät nicht verwendet Ihre arméabi-v7a-Bibliotheken (und möglicherweise Ihre App aus dem Markt verstecken).

Ich habe persönlich daran gearbeitet, indem ich ARMv7-Unterstützung mit der neuen cpufeatures-Bibliothek , die mit NDK r4b bereitgestellt wird, um einige armee-liba-on-demand mit dlopen () zu laden.

    
olivierg 05.08.2010 11:10
quelle

Tags und Links