To pytanie jest częściowo techniczne, częściowo meta, częściowo subiektywne i bardzo szczegółowe:
Jestem niezależnym twórcą gier pracującym 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 zmagającym się z Androidem i openGL-ES
Jednak zdecydowana większość pytań dotyczy rozszerzenia GLSurfaceView
. Zrobiłem całą aplikację bez rozszerzania GLSurfaceView
(i działa dobrze). Nie widzę żadnego powodu, aby rozciągać się GLSurfaceView
na większość pytań, które napotkałem.
Co gorsza, dokumentacja Androida sugeruje, że powinieneś, ale nie zawiera szczegółowego wyjaśnienia, dlaczego lub czym są zalety / wady, a nie przedłużanie i robienie wszystkiego poprzez wdrożenie własnego, GLSurfaceView.Renderer
tak jak ja
Mimo to sama 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 zrobić to w ten sposób w porównaniu do sposobu, w jaki to robiłem (i sugerując w odpowiedziach dla innych do zrobienia).
Czy jest coś, za czym tęsknię? Czy w międzyczasie powinienem przestać odpowiadać na pytania?
onResume()
Odpowiedzi:
Mam bardzo minimalne rozszerzenie dla siebie
GLSurfaceView
i większość mądrości należy do mojej implementacjiGLSurfaceView.Renderer
. Miałem następujące trzy powody, dla których warto użyć opakowaniaGLSurfaceView
:Baza
GLSurfaceView
nie umożliwia odzyskaniaRenderer
instancji. Mam wiele powierzchni, a gdy otrzymuję zdarzenie interfejsu użytkownika dla jednej z nich, chcę przekazać polecenie do odpowiedniego mechanizmu renderującego. ZastępujęsetRenderer
i zachowuję referencję w mojej rozszerzonej klasie.GLSurfaceView.Renderer
nie otrzymuje powiadomień dotyczącychonDetachedFromWindow()
lubsurfaceDestroyed()
. Spowodowało to pewne problemy z moją implementacją. Moje rozszerzenieGLSurfaceView
zastępuje te metody i informuje mRenderer . Jest to możliwe dzięki §1 .Niektóre metody są owinięte tylko dodać
try { super.
cokolwiek; } catch() { log(
cokolwiek) }
. Na przykładqueueEvent()
wyrzuci, jeśli moduł renderujący nie jest ustawiony; ale dla mnie OK jest po prostu ignorować takie niespójności na osi czasu.źródło
GLSurfaceView
a nie rozszerzonymGLSurfaceView.Renderer
. Chociaż w punkcie 1 zachowuję renderer jako zmienną w mojej działalności. Teoretycznie można uzyskać z dowolnego miejsca poprzez odlewanie kontekst:((MyActivity)view.getContext()).getRenderer()
. Być może nieco bardziej niebezpieczne, ponieważ obiekt kontekstu niekoniecznie musi byćMyActivity
Co najmniej jednym dobrym powodem do rozszerzenia GLSurfaceView jest możliwość utworzenia go bezpośrednio z pliku XML układu, tak jak każdy inny widget:
źródło
<android.opengl.GLSurfaceView android:id="@+id/graphics_glsurfaceview1" android:layout_width="fill_parent" android:layout_height="fill_parent" />
Cóż ... GLSurfaceView jest, jak jestem pewien, zauważyłeś, tylko opakowaniem dla wspólnego dobra. Zawiera wszystkie funkcje, które należałoby renderować za pomocą opengl, z opcją ładnego włączenia go w hierarchię widoku Android.
Nie podałeś swojej alternatywy, więc nie można jej porównać, ale mam nadzieję, że stworzyłeś inny wątek do renderowania, tak jak robi to GLSurfaceView, lub twoje dane wejściowe mogą być opóźnione.
Więc jeszcze raz: GLSurfaceView zapewnia nowy wątek do renderowania, więc nie musisz się martwić opóźnieniem wprowadzania danych przez użytkownika
źródło
GLSurfaceView
robi to (uruchamia wątek renderujący), nawet jeśli go nie rozszerzysz. UżywamGLSurfaceView
, ale nie przedłużam. Pytam, jakie są korzyści z rozszerzenia go i zastąpienia różnych metod w nim zawartych, zamiast po prostu posiadania wszystkiego wRenderer