2010-08-02 6 views
8

Ich versuche zu entscheiden, ob in erster Linie Floats oder Ints für alle 3D-Elemente in meiner App verwendet werden sollen (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.Fließkomma oder Festkomma für Android NDK OpenGL apps?

Ich plane jedoch, alle Daten größtenteils vorzubereiten (d. H. Haben Vertexpuffer wo anwendbar und transformieren mit Matrizen, die sich nicht viel ändern), also stopfen ich nur Daten in OpenGL's Kehle. 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 ausschließt.)

Auch - wie ist die Strafe, wenn ich Ints und Floats mische und vergleiche? 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 eingehen?

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

(Und ich hofft insgeheim, dass fadden diese Frage liest und hat eine tolle Antwort.)

Antwort

14

ältere Android-Geräte wie der G1 und MyTouch hat ARMv6 CPUs ohne Punkt Unterstützung zu schweben. 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 erfordern, als die älteren Geräte sowieso bieten können, also müssen Sie entscheiden, welche Hardwareebene Sie unterstützen möchten.

Wenn Sie ausschließlich in Java codieren, wird Ihre App die FP-Hardware nutzen, 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 dies 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 von Java aus langsam zugegriffen wird, aber sehr schnell von der nativen Seite. (Ich weiß nicht viel über die GL-Implementierung, also kann ich nicht viel mehr bieten.)

Einige Geräte unterstützen zusätzlich die NEON "Advanced SIMD" -Erweiterung, die einige ausgefallene Funktionen bietet, die über das Wesentliche hinausgehen VFP-Unterstützung hat. Sie müssen dies jedoch zur Laufzeit testen, wenn Sie es verwenden möchten (es sieht so aus, als ob es jetzt einen Beispielcode dafür gibt - siehe NDK page für NDK r4b).

Eine frühere Antwort hat einige info about the gcc Flags, die vom NDK für "hard" fp verwendet werden.

Letztendlich hängt die Antwort auf "Fest oder 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 Teil des Marktes ab.

+1

Ich wusste, dass Fadden die Antwort darauf hatte. Ich wünschte, ich könnte mehr als einmal abstimmen :) Ich beschränke mich bereits auf OpenGL ES 2.0, damit ich Vertex- und Fragment-Shader schreiben kann, also denke ich, dass ich auch den ganzen Weg gehen kann und ARMv7 benötige (was wahrscheinlich auch reicht) Hand). Ich würde lieber mehr Leute von einer kleineren Nutzerbasis mit einer gut aussehenden App anziehen, als etwas Müll in die Massen zu schmeißen. Die meiste Zeit haben sie damit aufgehört, Spiele für die PlayStation 1 zu entwickeln. – EboMike

+1

Sie sollten dann auf ARMv7 float gehen. Es geht nicht Hand in Hand mit OpenGL ES 2.0, aber es ist in der Nähe – ognian

+0

Es scheint, dass die meisten neuen Handys OpenGL ES 2.0 haben. Allerdings habe ich mir Benchmark-Werte wie den AnTuTu-Benchmark angesehen und herausgefunden, dass viele der preisgünstigeren Modelle ohne FPU sind. –

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, wie Android 2.1 für dieses Gerät gebaut wurde, wird das Gerät nicht Verwenden Sie Ihre Armea-v7a-Bibliotheken (und versteckt möglicherweise Ihre App im Market).

ich persönlich um diese arbeitete von ARMv7 Unterstützung Erfassung der neuen cpufeatures library mit NDK R4b versehen mit (etwas armeabi-V7A lib mit dlopen bei Bedarf zu laden).