Dette spørgsmål er delteknisk, del-meta, del-subjektivt og meget specifikt:
Jeg er en indie-spiludvikler arbejder på android, og i de sidste 6 måneder har jeg kæmpet og endelig lykkedes at lave min egen 3D-spil-app til Android. Så jeg troede, jeg ville hoppe på SO og hjælpe andre, der kæmper med android og openGL-ES
Men langt de fleste spørgsmål vedrører udvidelse af GLSurfaceView
. Jeg lavede hele min app uden at udvide GLSurfaceView
(og den kører fint). Jeg kan slet ikke se nogen grund til at udvide GLSurfaceView
til de fleste af de spørgsmål, jeg støder på.
Værre, android-dokumentationen antyder, at du burde, men giver ingen detaljeret forklaring på, hvorfor eller hvad fordele / ulemper er vs ikke at udvide og gøre alt ved at implementere dine egne GLSurfaceView.Renderer
som jeg gjorde
Stadig den store mængde spørgsmål, hvor problemet rent ude har at gøre med at udvide GLSurfaceView
får mig til at spekulere på, om der faktisk er en rigtig god grund til at gøre det på den måde i forhold til den måde, jeg har gjort det (og foreslår i mine svar til andre at gøre).
Så er der noget Jeg mangler? Skal jeg stoppe med at besvare spørgsmål i mellemtiden?
Kommentarer
- dejligt spørgsmål, jeg er meget glad for at svare på ..
- En af grundene til, hvorfor GLSurfaceView udvides, kan findes her: gamedev. stackexchange.com/questions/12629/… Uden at være klar over det, har jeg faktisk allerede overgået de spørgsmål, der er omtalt i dette spørgsmål i min egen app ved at genindlæse teksturer osv. = “f1a1db7d86″>
Svar
Jeg har en meget minimal udvidelse til min GLSurfaceView
, og det meste af visdommen hører til min implementering af GLSurfaceView.Renderer
. Jeg havde følgende tre grunde til at bruge en indpakning til GLSurfaceView
:
-
Basen
GLSurfaceView
giver ingen måde at fåRenderer
-forekomsten tilbage. Jeg har flere overflader, og når jeg modtager en UI-begivenhed for en af dem, vil jeg overføre kommandoen til den tilsvarende gengiver. Så jeg tilsidesættersetRenderer
og holder referencen i min udvidede klasse. -
GLSurfaceView.Renderer
modtager ikke underretninger foronDetachedFromWindow()
ellersurfaceDestroyed()
. Dette medførte nogle problemer med min implementering. Min udvidelse afGLSurfaceView
tilsidesætter disse metoder og lader mRenderer vide. Det er muligt på grund af § 1 . -
Nogle metoder er kun pakket for at tilføje
try { super.
uanset; } catch() { log(
uanset hvad) }
. For eksempel vilqueueEvent()
kaste, hvis gengiveren ikke er indstillet; men for mig er det OK at ignorere simpelthen sådanne uoverensstemmelser i tidslinjen.
Kommentarer
Svar
Mindst en god grund til at udvide GLSurfaceView er at være i stand til at instantiere det direkte fra en layout xml-fil, som enhver anden 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
- Det kan du alligevel gøre ved hjælp af
<android.opengl.GLSurfaceView android:id="@+id/graphics_glsurfaceview1" android:layout_width="fill_parent" android:layout_height="fill_parent" />
- Godt punkt. Forskellen er, at i mit eksempel puster Android-rammen op og opsætter alt uden behov for ekstra linjer med kode. Din metode er mere kode, men fleksibel til at erstatte implementeringen. Bortset fra det virker begge måder ens.
Svar
Nå … GLSurfaceView er, som jeg er sikker på, at du har bemærket, bare en indpakning til fælles bedste. Den indkapsler al den funktionalitet, som man har brug for at gengive med opengl, og har mulighed for at indarbejde det pænt i Android-visningshierarkiet.
Du har ikke givet dit alternativ, så det er umuligt at sammenligne, men jeg håber, du har skabt en anden tråd til gengivelse, som GLSurfaceView gør, ellers kan din brugerindgang forsinke.
Så igen: GLSurfaceView giver en ny tråd til gengivelse, så du behøver ikke bekymre dig om brugerinputforsinkelse
Kommentarer
- Ja, men
GLSurfaceView
gør det (starter en gengivelsestråd), selvom du ' t udvider det. Jeg brugerGLSurfaceView
, men jeg udvider det ikke '. Jeg ' spørger, hvilke fordele der er ved at udvide det og tilsidesætte de forskellige metoder deri i modsætning til bare at have alt iRenderer
- welp, jeg prøvede 🙂 Jeg kan se på det senere, nu er jeg også interesseret!
GLSurfaceView
i stedet forGLSurfaceView.Renderer
. Selvom jeg på punkt 1 holder rendereren som en variabel i min aktivitet. I teorien kan jeg få det overalt ved at kaste konteksten:((MyActivity)view.getContext()).getRenderer()
. Måske lidt farligere, da kontekstobjektet muligvis ikke nødvendigvis erMyActivity