Dette spørsmålet er delteknisk, del-meta, del-subjektivt og veldig spesifikt:
Jeg er en indiespillutvikler jobbet med android, og de siste 6 månedene har jeg slitt og til slutt lyktes i å lage min egen 3D-spillapp for android. Så jeg trodde jeg skulle hoppe på SO og hjelpe andre som sliter med android og openGL-ES
De aller fleste spørsmålene er imidlertid knyttet til å utvide GLSurfaceView
. Jeg lagde hele appen min uten å utvide GLSurfaceView
(og den går bra). Jeg kan ikke se noen grunn til å utvide GLSurfaceView
til de fleste spørsmålene jeg kommer over.
Verre, android-dokumentasjonen innebærer at du burde, men gir ingen detaljert forklaring på hvorfor eller hva fordeler / ulemper er mot å ikke utvide og gjøre alt gjennom å implementere dine egne GLSurfaceView.Renderer
som jeg gjorde
Likevel, det store volumet av spørsmål der problemet bare har å gjøre med å utvide GLSurfaceView
får meg til å lure på om det faktisk er noen veldig god grunn til å gjøre det på den måten mot slik jeg har gjort det (og foreslår i mine svar til andre å gjøre).
Så, er det noe Jeg savner? Skal jeg slutte å svare på spørsmål i mellomtiden?
Kommentarer
- hyggelig spørsmål jeg er opptatt av å svare på ..
- En grunn til hvorfor utvide GLSurfaceView finner du her: gamedev. stackexchange.com/questions/12629/… Uten å innse det, har jeg faktisk allerede gått bort fra problemene som er snakket om i dette spørsmålet i min egen app ved å laste opp teksturer osv = «f1a1db7d86″>
Svar
Jeg har en veldig minimal utvidelse for GLSurfaceView
, og det meste av visdommen hører til implementeringen min av GLSurfaceView.Renderer
. Jeg hadde følgende tre grunner til å bruke en innpakning til GLSurfaceView
:
-
Basen
GLSurfaceView
gir ingen måte å fåRenderer
forekomsten tilbake. Jeg har flere overflater, og når jeg mottar en UI-hendelse for en av dem, vil jeg overføre kommandoen til den tilsvarende gjengiveren. Så jeg overstyrersetRenderer
og beholder referansen i min utvidede klasse. -
GLSurfaceView.Renderer
mottar ikke varsler foronDetachedFromWindow()
ellersurfaceDestroyed()
. Dette forårsaket noen problemer med implementeringen min. Min utvidelse avGLSurfaceView
overstyrer disse metodene og lar mRenderer vite. Det er mulig på grunn av § 1 . -
Noen metoder er bare pakket inn for å legge til
try { super.
uansett; } catch() { log(
hva som helst) }
. For eksempel vilqueueEvent()
kaste hvis gjengiveren ikke er satt, men for meg er det OK å bare ignorere slike uoverensstemmelser i tidslinjen.
Kommentarer
Svar
Minst en god grunn til å utvide GLSurfaceView er å være i stand til å instantiere den direkte fra en layout-xml-fil, akkurat som enhver annen widget:
<RelativeLayout ... > <com.example.MyGlSurfaceView android:id="@+id/my_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" /> </RelativeLayout>
Kommentarer
- Du kan gjøre det uansett ved å bruke
<android.opengl.GLSurfaceView android:id="@+id/graphics_glsurfaceview1" android:layout_width="fill_parent" android:layout_height="fill_parent" />
- Bra poeng. Forskjellen er at Android-rammeverket i mitt eksempel blåser opp og setter opp alt uten å trenge ekstra linjer med kode. Metoden din er mer kode, men fleksibel for å erstatte implementering. Bortsett fra det, virker begge veier like.
Svar
Vel … GLSurfaceView er, som jeg er at du har lagt merke til, bare en innpakning til felles beste. Den innkapsler all funksjonaliteten man trenger å gjengi med opengl, og har muligheten til å innlemme den pent i Android View-hierarkiet.
Du oppga ikke alternativet ditt, så det er umulig å sammenligne, men jeg håper du skapte en annen tråd for gjengivelse slik GLSurfaceView gjør, ellers kan brukerinndataene dine forsinke.
Så igjen: GLSurfaceView gir en ny tråd for gjengivelse, så du trenger ikke å bekymre deg for brukerinngangssperre
Kommentarer
- Ja, men
GLSurfaceView
gjør det (starter en gjengetråd) selv om du ikke ' t utvider den. Jeg brukerGLSurfaceView
, men jeg utvider ikke '. Jeg ' spør hva fordelene er med å utvide det og overstyre de forskjellige metodene der, i motsetning til bare å ha alt iRenderer
- welp, jeg prøvde 🙂 Jeg kan se nærmere på det senere, nå er jeg også interessert!
GLSurfaceView
i stedet forGLSurfaceView.Renderer
. Selv om jeg er på punkt 1, holder jeg gjengiveren som en variabel i aktiviteten min. I teorien kan jeg få det fra hvor som helst ved å kaste sammenhengen:((MyActivity)view.getContext()).getRenderer()
. Kanskje litt farligere da kontekstobjektet ikke nødvendigvis erMyActivity