2010-08-02 13 views
8

Próbuję zdecydować, czy przede wszystkim używać elementów pływających lub int dla wszystkich elementów związanych z 3D w mojej aplikacji (która w większości jest w C++). Rozumiem, że większość urządzeń opartych na ARM nie ma wsparcia zmiennoprzecinkowego, więc sądzę, że każde ciężkie podnoszenie za pomocą pływaków byłoby zauważalnie wolniejsze.Zmienna lub punkt stały dla aplikacji OpenGL na Androida NDK?

Jednak planuję przygotować wszystkie dane w przeważającej części (tj. W razie potrzeby posiadać bufory vertex i transformować za pomocą macierzy, które nie zmieniają się zbyt często), więc po prostu wypycham dane przez gardło OpenGL. Czy mogę założyć, że dzieje się to mniej więcej prosto na GPU i czy będzie to rozsądnie szybkie? (Btw, minimalnym wymaganiem jest OpenGL ES 2.0, więc prawdopodobnie wyklucza starsze telefony oparte na 1.x).

Również - jaka jest kara, gdy miksuję i dopasowuję ints i floats? Zakładając, że cała moja geometria jest tylko wstępnie zbudowanymi buforami float, ale używam ints dla macierzy, ponieważ wymagają one drogich operacji, takich jak multiplikacje macierzy, ile gniewu tu przyłożę?

Swoją drogą, wiem, że powinienem zachować niskie oczekiwania (brzmi to tak, jakby nawet pytanie o pływaki na procesorze wymagało zbyt wiele), ale czy jest coś, co zdalnie przypomina rejestr 128-bitowy VMX?

(I mam nadzieję, że potajemnie Fadden czyta to pytanie i ma niesamowite odpowiedź.)

Odpowiedz

14

Starsze Android urządzeń takich jak G1 i MyTouch mają ARMv6 CPU bez wsparcia pływający punkt. Większość nowszych urządzeń, takich jak Droid, Nexus One i Incredible, używa procesorów ARMv7-A, które mają sprzęt FP. Jeśli twoja gra naprawdę wymaga dużych nakładów 3D, może wymagać więcej od implementacji 3D niż starsze urządzenia, mimo to musisz zdecydować, jaki poziom sprzętu chcesz obsługiwać.

Jeśli kodusz wyłącznie w języku Java, Twoja aplikacja będzie korzystać ze sprzętu FP, jeśli jest dostępna. Jeśli napiszesz natywny kod z NDK i wybierzesz architekturę armv5te, w ogóle nie otrzymasz sprzętowego FP. Jeśli wybierzesz architekturę armv7-a, to jednak Twoja aplikacja nie będzie dostępna na urządzeniach poprzedzających procesor ARMv7-A.

OpenGL z Java powinien być teraz na wierzchu "bezpośrednich" buforów bajtowych, które obecnie mają wolny dostęp z Java, ale bardzo szybko od strony natywnej. (Nie wiem zbyt wiele o implementacji GL, więc nie mogę zaoferować o wiele więcej.)

Niektóre urządzenia dodatkowo obsługują rozszerzenie NEON "Advanced SIMD", które zapewnia dodatkowe funkcje, wykraczające poza to, co podstawowe Obsługa VFP. Jednak musisz to przetestować w środowisku wykonawczym, jeśli chcesz go użyć (wygląda na to, że jest teraz przykładowy kod - zobacz NDK page dla NDK r4b).

Wcześniejsza odpowiedź ma pewne flagi info about the gcc używane przez NDK dla "twardego" fp.

Ostatecznie odpowiedź na "naprawiony lub zmieniony" sprowadza się do klasy urządzeń, na których aplikacja ma działać. Z pewnością łatwiej jest kodować dla armv7-a, ale odcinasz się od kawałka rynku.

+1

Wiedziałem, że Fadden miał na to odpowiedź. Chciałbym móc głosować więcej niż raz :) Już ograniczam się do OpenGL ES 2.0, dzięki czemu mogę napisać vertex i fragmenty shaderów, więc myślę, że równie dobrze mogę przejść całą drogę i wymagać ARMv7 (co prawdopodobnie idzie w parze dłoń). Wolałabym przyciągnąć więcej osób z mniejszej bazy użytkowników z atrakcyjnie wyglądającą aplikacją niż wyrzucać śmieci do mas. W większości przestali także robić gry na PlayStation 1. – EboMike

+1

Powinieneś pójść na float na ARMv7. Nie idzie to w parze z OpenGL ES 2.0, ale jest blisko. – ognian

+0

Wygląda na to, że większość nowych telefonów ma OpenGL ES 2.0. Jednak przyjrzałem się punktom odniesienia, takim jak benchmark AnTuTu, i odkryłem, że wiele z tańszych modeli nie ma FPU. –

5

Moim zdaniem powinieneś trzymać się tak długo, jak to możliwe.

Nie tylko stare telefony nie obsługują funkcji zmiennoprzecinkowej, ale także nowe, takie jak HTC Wildfire.

Ponadto, jeśli zdecydujesz się na ARMv7, pamiętaj, że na przykład Motorola Milestone (Droid for Europe) ma procesor ARMv7, ale ze względu na sposób, w jaki został zbudowany Android 2.1 dla tego urządzenia, urządzenie nie będzie działać. używaj swoich bibliotek libe (i może ukryć twoją aplikację przed Rynkiem).

Osobiście pracowałem nad tym, wykrywając obsługę ARMv7 przy użyciu nowego cpufeatures library dostarczanego z NDK r4b, aby załadować na żądanie bibliotekę armeabi-v7a za pomocą dlopen().

Powiązane problemy