2011-12-16 5 views
10

Koduję aplikację OpenGL ES 1.1 na Androida i iPhone'a. Silnik OpenGL ES znajduje się we wspólnej bibliotece i jest dostępny za pośrednictwem NDK na Androidzie.OpenGL na Androida i iOS: optymalizacje i tam, gdzie się różnią

Szukam optymalizacji wydajności OpenGL. Jest mnóstwo filmów i zasobów tam, np .:

http://www.vizworld.com/2010/02/ngmocos-tim-omernick-optimizing-opengl-iphone/

http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/Performance/Performance.html#//apple_ref/doc/uid/TP40008793-CH105

http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/TechniquesforWorkingwithVertexData/TechniquesforWorkingwithVertexData.html

OpenGL ES 2.0 : Seeking VBO Performance/Optimisation Tips For Many Moving Vertices

When are VBOs faster than "simple" OpenGL primitives (glBegin())?

https://gamedev.stackexchange.com/questions/1068/opengl-optimization-tips

Ale ogólnie nie są dobrze znane techniki, które stosuje się powszechnie, takie jak:

  • obiektów buforowych Zastosowanie wierzchołek (VBOs)
  • Minimalizacja stanu OpenGL zmienia
  • użycie tekstury atlassing gdzie jest to możliwe, aby uniknąć konieczności wyboru wiele różnych tekstur:

Niektóre techniki są lub mogą być nieco bardziej czułe w ich specyfice i mogą różnić się w zależności od systemu Android i iPhone'a i właśnie to mnie interesuje. le:

  • Przepnij dane wierzchołków wewnątrz każdego wierzchołka: np. vertex coord; struktura tekstur; normalna. Czy w przeplotzie jest preferowana kolejność elementów?
  • Wyłóż każdy wierzchołek do następnej wielokrotności pewnej liczby bajtów. Widzę, że liczba 32 jest zakręcona, ale w niektórych miejscach widzę też 4 lub 8.
  • rozważyć użycie krótki lub podobny dla każdego wierzchołka układzie współrzędnych, zamiast pływaka

Więc moje pytanie brzmi: jakie są drobniejsze szczegóły magicznych optymalizacji takie jak ostatnim liście powyżej, które różnią się między Android i iPhone ? Gdzie różnią się, jaka jest najlepsza strategia? Po prostu użyj wartości, która pasuje do obu światów? (Dokładne dostrojenie takich detali w czasie pracy w zależności od platformy może być nieco przesadzone?)

+3

Nie jestem ekspertem w tej dziedzinie, ale optymalizacja AFAIK zależy głównie od układu scalonego. IPhony są (nieco) bardziej spójne w układach GPU, ale w Androidzie możesz mieć kilka układów GPU: Adreno 2xx, PowerVR SGXxxx, Malixxx, Tegra2. Istnieją również różnice w funkcjonalności. Ponadto, tylko z ciekawości? Dlaczego używasz wersji 1.1, a nie 2.0? Myślę, że za pomocą programowalnych shaderów można lepiej zoptymalizować kod (i oczywiście aplikacja obsługuje mniej urządzeń ... ale AFAIK w dzisiejszych czasach każde urządzenie z Androidem obsługuje suporty 2.0) –

+0

Jeśli chodzi o korzystanie z OpenGL ES1.1: chodzi o obsługę starszych urządzeń . Dobra uwaga na temat chipsetów! – MeinHeinlein

Odpowiedz

1

Główne (ortodoksyjne) optymalizacje zostały wymienione w odpowiedzi. Jednakże, istnieje kilka innych mniej znanych technik, które mają zastosowanie do renderowania na urządzeniach mobilnych:

  1. Częstotliwość zegara i przepustowość pamięci mobilnych procesorów graficznych są znacznie niższe w porównaniu do potworów stacjonarnych. Rozsądnie byłoby ograniczyć dostęp do overdraw i tekstur w jak największym stopniu. Rozważ użycie algorytmów i technik usuwania ukrytej powierzchni na poziomie procesora.

  2. Użyj profilerów specyficznych dla dostawcy, aby precyzyjnie dostroić kod do określonych układów. Użyj różnych ścieżek kodu, jeśli wydajność różni się znacznie w zależności od dostawcy.

  3. Po raz kolejny współczynnik napełnienia na urządzeniach mobilnych ma zasadnicze znaczenie. Używaj mniejszych typów danych, mniej pobrań tekstur.Jest to szczególnie ważne w przypadku ekranu Retina firmy Apple na nowym iPadzie. Wolisz kalkulacje od szukania tekstur dla rozsądnych formuł (powinieneś profilować).

Powiązane problemy