Denna fråga är delteknisk, delmeta, del-subjektiv och väldigt specifik:
Jag är en indiespelutvecklare jobbar med android, och de senaste 6 månaderna har jag kämpat och lyckats äntligen skapa min egen 3D-spelapp för Android. Så jag trodde att jag skulle hoppa på SO och hjälpa andra som kämpar med android och openGL-ES
Men de allra flesta frågorna gäller att utöka GLSurfaceView
. Jag skapade hela min app utan att förlänga GLSurfaceView
(och den går bra). Jag kan inte se någon anledning alls att förlänga GLSurfaceView
de flesta frågor jag stöter på.
Ännu värre, Android-dokumentationen antyder att du borde, men ger ingen detaljerad förklaring av varför eller vad fördelarna / nackdelarna är mot att inte utöka och göra allt genom att implementera dina egna GLSurfaceView.Renderer
som jag gjorde
Fortfarande, den stora volymen frågor där problemet bara är att utöka GLSurfaceView
får mig att undra om det faktiskt finns någon riktigt bra anledning att göra det på det sättet jämfört med hur jag har gjort det (och i mitt svar föreslår att andra ska göra).
Så, finns det något Jag saknar? Ska jag sluta svara på frågor under tiden?
Kommentarer
- trevlig fråga jag är intresserad av att svara på.
- En anledning till varför utvidga GLSurfaceView finns här: gamedev. stackexchange.com/questions/12629/… Utan att ha insett det har jag faktiskt redan kringgått de frågor som talas om i denna fråga i min egen app genom att ladda om texturer etc
onResume()
Svar
Jag har ett mycket minimalt tillägg för min GLSurfaceView
, och det mesta av visdom tillhör min implementering av GLSurfaceView.Renderer
. Jag hade följande tre skäl att använda ett omslag för GLSurfaceView
:
-
Basen
GLSurfaceView
ger inget sätt att få tillbakaRenderer
-instansen. Jag har flera ytor och när jag får en UI-händelse för en av dem vill jag skicka kommandot till motsvarande renderare. Så jag åsidosättersetRenderer
och behåller referensen i min utökade klass. -
GLSurfaceView.Renderer
får inte aviseringar föronDetachedFromWindow()
ellersurfaceDestroyed()
. Detta orsakade vissa problem med min implementering. Min förlängning avGLSurfaceView
åsidosätter dessa metoder och låter mRenderer veta. Det är möjligt på grund av § 1 . -
Vissa metoder läggs endast in för att lägga till
try { super.
vad som helst; } catch() { log(
vad som helst) }
. Till exempel kommerqueueEvent()
att kasta om renderaren inte är inställd, men för mig är det OK att ignorera helt enkelt sådana tidslinjeinkonsekvenser.
Kommentarer
Svar
Åtminstone en god anledning att förlänga GLSurfaceView är att kunna instantiera den direkt från en layout xml-fil, precis som alla andra widgetar:
<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 göra det ändå med
<android.opengl.GLSurfaceView android:id="@+id/graphics_glsurfaceview1" android:layout_width="fill_parent" android:layout_height="fill_parent" />
- Bra poäng. Skillnaden är att Android-ramverket i mitt exempel blåser upp och ställer in allt utan att behöva extra kodrader. Din metod är mer kod, men flexibel för att ersätta implementeringen. Bortsett från det verkar båda sätten likna.
Svar
Tja … GLSurfaceView är, som jag är säker på att du har lagt märke till, bara ett omslag för allmänhetens bästa. Det inkapslar all funktionalitet man skulle behöva återge med opengl, med möjlighet att integrera det snyggt i Android View-hierarkin. ditt alternativ så det är omöjligt att jämföra, men jag hoppas att du skapade en annan tråd för rendering som GLSurfaceView gör, annars kan din användarinmatning fördröjas.
Så igen: GLSurfaceView ger en ny tråd för rendering, så du behöver inte oroa dig för användarens ingångsfördröjning
Kommentarer
- Ja, men
GLSurfaceView
gör det (startar en renderingstråd) även om du ' t förlänger det. Jag använderGLSurfaceView
, men jag förlänger inte '. Jag ' frågar vilka fördelar det är att utvidga det och åsidosätta de olika metoderna där, i motsats till att bara ha allt iRenderer
- welp, jag försökte 🙂 Jag kan titta på det senare, nu är jag också intresserad!
GLSurfaceView
snarare änGLSurfaceView.Renderer
. Men på punkt 1 behåller jag renderaren som en variabel i min aktivitet. I teorin kan jag få det var som helst genom att kasta sammanhanget:((MyActivity)view.getContext()).getRenderer()
. Kanske lite farligare eftersom kontextobjektet inte nödvändigtvis ärMyActivity