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?

dokumentace Android openGL

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:

  1. Základní GLSurfaceView neposkytuje žádný způsob, jak získat instanci Renderer 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íšu setRenderer a ponechám odkaz v mé rozšířené třídě.

  2. GLSurfaceView.Renderer neobdrží oznámení pro onDetachedFromWindow() nebo surfaceDestroyed(). 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 .

  3. Některé metody jsou zabaleny pouze pro přidání try { super. cokoli ; } catch() { log( cokoli ) }. Například queueEvent() hodí, pokud není nastaven Renderer; ale pro mě je v pořádku jednoduše ignorujte takové nesrovnalosti na časové ose.

Komentáře

  • I ' Začal jsem to dělat také, i když otázka se více zaměřuje na to, proč byste mohli skutečnou logiku umístit do rozšířeného GLSurfaceView spíše než do GLSurfaceView.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
  • je ' v pořádku, pokud máte jeden renderer. Ale jak jsem již řekl, máme mnoho rendererů a jsou propojeny s různými SurfaceViews – nepořádek!

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ám GLSurfaceView, 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á!

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *