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?

Dokumentacja openGL Androida

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:

  1. Podstawa GLSurfaceView nie zapewnia możliwości odzyskania instancji Renderer. 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.

  2. GLSurfaceView.Renderer nie otrzymuje powiadomień dotyczących onDetachedFromWindow() ani surfaceDestroyed(). Spowodowało to pewne problemy w mojej realizacji. Moje rozszerzenie GLSurfaceView zastępuje te metody i informuje mRenderer . Jest to możliwe dzięki § 1 .

  3. Niektóre metody są zawijane tylko w celu dodania try { super. cokolwiek ; } catch() { log( cokolwiek ) }. Na przykład queueEvent() wyrzuci, jeśli Renderer nie jest ustawiony, ale dla mnie można po prostu zignoruj takie niespójności na osi czasu.

Komentarze

  • I ' Zaczęliśmy również to robić, chociaż pytanie jest bardziej ukierunkowane na to, dlaczego można umieścić rzeczywistą logikę w rozszerzonym GLSurfaceView, a nie GLSurfaceView.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
  • ' jest w porządku, jeśli masz jeden renderer. Ale jak powiedziałem wcześniej, mamy wiele mechanizmów renderujących, które łączą się z różnymi SurfaceViews – bałagan!

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żywam GLSurfaceView, 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 w Renderer
  • dobrze, próbowałem 🙂 Mogę się tym zająć później, teraz też jestem zainteresowany!

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *