Tato otázka je částečně technická, částečně meta, částečně subjektivní a velmi specifická:
Jsem nezávislý vývojář her pracuji na Androidu a posledních 6 měsíců jsem se potýkal a nakonec se mi podařilo vytvořit si vlastní 3D herní aplikaci pro Android. Takže jsem si myslel, že skočím na SO a pomůžu ostatním, kteří se potýkají s Androidem a openGL-ES.
Převážná většina otázek se však týká rozšíření GLSurfaceView
. Vytvořil jsem celou aplikaci bez rozšíření GLSurfaceView
(a funguje dobře). Nevidím vůbec žádný důvod, proč bych měl GLSurfaceView
rozšířit o většina otázek, se kterými se setkávám.
Horší je, že dokumentace pro Android znamená, že byste měli, ale neposkytuje žádné podrobné vysvětlení, proč nebo jaké výhody / nevýhody se oproti tomu nerozšiřují a dělají vše prostřednictvím implementace svých vlastních GLSurfaceView.Renderer
stejně jako já
Stále je tu naprostý objem otázek, u kterých je problém čistě spojen s rozšířením GLSurfaceView
nutí mě přemýšlet, jestli ve skutečnosti existuje nějaký opravdu dobrý důvod, proč to dělám takhle proti tomu, jak jsem to dělal (a ve svých odpovědích ostatním navrhuji).
Takže, existuje něco Postrádám? Mám mezitím přestat odpovídat na otázky?
Komentáře
- pěkná otázka, o kterou se zajímám.
- Jeden důvod, proč rozšířit GLSurfaceView, naleznete zde: gamedev. stackexchange.com/questions/12629/… Aniž bych si to uvědomil, ve skutečnosti jsem již ve své vlastní aplikaci obešel problémy, o nichž se v této otázce hovoří, načtením textur atd.
onResume()
odpověď
Mám velmi minimální příponu pro svůj GLSurfaceView
a většina moudrosti patří k mé implementaci GLSurfaceView.Renderer
. Měl jsem následující tři důvody, proč použít obal pro GLSurfaceView
:
-
Základní
GLSurfaceView
neposkytuje žádný způsob, jak získat instanciRenderer
zpět. Mám více povrchů a když pro jeden z nich dostanu událost uživatelského rozhraní, chci předat příkaz příslušnému vykreslovacímu modulu. Takže přepíšusetRenderer
a ponechám odkaz v mé rozšířené třídě. -
GLSurfaceView.Renderer
neobdrží oznámení proonDetachedFromWindow()
nebosurfaceDestroyed()
. To způsobilo některé problémy s mou implementací. Moje rozšířeníGLSurfaceView
přepíše tyto metody a nechá mRenderer vědět. Je to možné z § 1 . -
Některé metody jsou zabaleny pouze pro přidání
try { super.
cokoli; } catch() { log(
cokoli) }
. NapříkladqueueEvent()
hodí, pokud není nastaven Renderer; ale pro mě je v pořádku jednoduše ignorujte takové nesrovnalosti na časové ose.
Komentáře
Odpovědět
Alespoň jedním dobrým důvodem pro rozšíření GLSurfaceView je možnost vytvořit jej instanci přímo ze souboru XML rozložení, stejně jako jakýkoli jiný 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>
Komentáře
- To můžete stejně provést pomocí
<android.opengl.GLSurfaceView android:id="@+id/graphics_glsurfaceview1" android:layout_width="fill_parent" android:layout_height="fill_parent" />
- Dobrá poznámka. Rozdíl je v tom, že v mém příkladu se rámec Android nafoukne a nastaví vše bez nutnosti dalších řádků kódu. Vaše metoda je více kódu, ale flexibilní, aby nahradila implementaci. Kromě toho se oba způsoby zdají podobné.
Odpověď
No … GLSurfaceView je, jaký jsem jistě jste si všimli, jen obal pro společné dobro. Zapouzdřuje všechny funkce, které by bylo potřeba vykreslit pomocí opengl, s možností pěkně ji začlenit do hierarchie zobrazení Android.
Nezadali jste vaše alternativa, takže je nemožné srovnávat, ale doufám, že jste vytvořili další vlákno pro vykreslení, jak to dělá GLSurfaceView, nebo může váš uživatelský zpoždění zaostávat.
Takže znovu: GLSurfaceView poskytuje nové vlákno pro vykreslování, takže si nemusíte dělat starosti se zpožděním vstupu uživatele
Komentáře
- Ano, ale
GLSurfaceView
to dělá (spustí vykreslovací vlákno), i když ' jej nerozšiřujete. PoužívámGLSurfaceView
, ale ' jej nerozšiřuji. ' Ptám se, jaké výhody má jeho rozšíření a přepsání různých metod, které jsou v něm obsaženy, na rozdíl od toho, že vše máRenderer
- welp, zkusil jsem to 🙂 Možná se na to podívám později, teď mě to také zajímá!
GLSurfaceView
spíše než doGLSurfaceView.Renderer
. I když v bodě 1, chovám renderer jako proměnnou ve své činnosti. Teoreticky to mohu získat odkudkoli pomocí obsazení kontextu:((MyActivity)view.getContext()).getRenderer()
. Možná trochu nebezpečnější, protože kontextový objekt nemusí být nutněMyActivity