To pytanie jest częściowo techniczne, częściowo meta, częściowo subiektywne i bardzo szczegółowe:
Jestem twórcą gier niezależnych pracowałem na Androidzie i przez ostatnie 6 miesięcy miałem problemy i wreszcie udało mi się stworzyć własną aplikację do gier 3D na Androida. Pomyślałem więc, że „wskoczę na SO i pomogę innym borykającym się z Androidem i OpenGL-ES
Jednak zdecydowana większość pytań dotyczy rozszerzenia GLSurfaceView
. Zrobiłem całą moją aplikację bez rozszerzania GLSurfaceView
(i działa dobrze). Nie widzę żadnego powodu, by przedłużyć GLSurfaceView
dla większość pytań, które napotykam.
Co gorsza, dokumentacja Androida sugeruje, że powinieneś, ale nie daje szczegółowego wyjaśnienia, dlaczego lub jakie są zalety / wady, a nie rozszerzanie i robienie wszystkiego poprzez implementację własnego GLSurfaceView.Renderer
tak jak ja
Mimo to ogromna liczba pytań, w których problem dotyczy wyłącznie rozszerzenia GLSurfaceView
sprawia, że zastanawiam się, czy rzeczywiście istnieje jakiś naprawdę dobry powód, aby to robić w ten sposób, w porównaniu ze sposobem, w jaki to robię (i sugerując innym w moich odpowiedziach).
Więc jest coś Brakuje mi? Czy w międzyczasie powinienem przestać odpowiadać na pytania?
Komentarze
- fajne pytanie, jestem zainteresowany odpowiedzią ..
- Jeden z powodów dlaczego rozszerzanie GLSurfaceView można znaleźć tutaj: gamedev. stackexchange.com/questions/12629/… Nie zdając sobie z tego sprawy, omijałem już kwestie omówione w tym pytaniu we własnej aplikacji, ładując ponownie tekstury itp.
onResume()
Odpowiedź
Mam bardzo minimalne rozszerzenie mojej GLSurfaceView
, a większość mądrości należy do mojej implementacji GLSurfaceView.Renderer
. Miałem następujące trzy powody, aby użyć opakowania dla GLSurfaceView
:
-
Podstawa
GLSurfaceView
nie zapewnia możliwości odzyskania instancjiRenderer
. Mam wiele powierzchni i gdy otrzymuję zdarzenie interfejsu użytkownika dla jednej z nich, chcę przekazać polecenie do odpowiedniego modułu renderującego. Dlatego nadpisujęsetRenderer
i zachowuję odniesienie w mojej rozszerzonej klasie. -
GLSurfaceView.Renderer
nie otrzymuje powiadomień dotyczącychonDetachedFromWindow()
anisurfaceDestroyed()
. Spowodowało to pewne problemy w mojej realizacji. Moje rozszerzenieGLSurfaceView
zastępuje te metody i informuje mRenderer . Jest to możliwe dzięki § 1 . -
Niektóre metody są zawijane tylko w celu dodania
try { super.
cokolwiek; } catch() { log(
cokolwiek) }
. Na przykładqueueEvent()
wyrzuci, jeśli Renderer nie jest ustawiony, ale dla mnie można po prostu zignoruj takie niespójności na osi czasu.
Komentarze
Odpowiedz
Przynajmniej jednym dobrym powodem rozszerzenia GLSurfaceView jest możliwość utworzenia instancji bezpośrednio z pliku XML układu, tak jak każdego innego widżetu:
<RelativeLayout ... > <com.example.MyGlSurfaceView android:id="@+id/my_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" /> </RelativeLayout>
Komentarze
- Mimo wszystko możesz to zrobić używając
<android.opengl.GLSurfaceView android:id="@+id/graphics_glsurfaceview1" android:layout_width="fill_parent" android:layout_height="fill_parent" />
- Słuszna uwaga. Różnica polega na tym, że w moim przykładzie framework Androida nadmuchuje i konfiguruje wszystko bez potrzeby stosowania dodatkowych wierszy kodu. Twoja metoda jest bardziej kodowa, ale elastyczna, aby zastąpić implementację. Poza tym oba sposoby wydają się podobne.
Odpowiedź
Cóż … GLSurfaceView jest, tak jak ja z pewnością zauważyłeś, że jest to tylko opakowanie dla wspólnego dobra. Zawiera wszystkie funkcje, które trzeba by wyrenderować w opengl, mając możliwość ładnego włączenia ich do hierarchii widoku Androida.
Nie zapewniłeś Twoja alternatywa, więc nie można jej porównać, ale mam nadzieję, że utworzyłeś kolejny wątek do renderowania, tak jak robi to GLSurfaceView, lub dane wejściowe użytkownika mogą się opóźniać.
Więc znowu: GLSurfaceView udostępnia nowy wątek do renderowania, więc nie musisz się martwić o opóźnienie wejścia użytkownika
Komentarze
- Tak, ale
GLSurfaceView
robi to (uruchamia wątek renderujący), nawet jeśli nie ' nie przedłużasz go. UżywamGLSurfaceView
, ale nie ' nie przedłużam. Pytam ', jakie korzyści płyną z jego rozszerzenia i zastąpienia różnych metod, w przeciwieństwie do posiadania wszystkiego wRenderer
- dobrze, próbowałem 🙂 Mogę się tym zająć później, teraz też jestem zainteresowany!
GLSurfaceView
, a nieGLSurfaceView.Renderer
. Chociaż w punkcie 1, zachowuję mechanizm renderujący jako zmienną w mojej działalności. Teoretycznie mogę go pobrać z dowolnego miejsca, rzutując kontekst:((MyActivity)view.getContext()).getRenderer()
. Być może trochę bardziej niebezpieczne, ponieważ obiekt kontekstu niekoniecznie musi byćMyActivity