Tämä kysymys on osittain tekninen, osittain meta, osittain subjektiivinen ja hyvin spesifinen:
Olen indie-pelin kehittäjä työskentelen androidilla, ja viimeisten kuuden kuukauden aikana olen taistellut ja onnistunut vihdoin tekemään oman 3D-pelisovellukseni Androidille. Joten ajattelin hypätä SO: hen ja auttaa muita androidin ja openGL-ES: n kanssa kamppailevia
Suurin osa kysymyksistä liittyy kuitenkin GLSurfaceView
laajentamiseen. Tein koko sovellukseni laajentamatta GLSurfaceView
(ja se toimii hyvin). En näe mitään syytä laajentaa GLSurfaceView
Suurin osa kohtaamistani kysymyksistä.
Mikä pahempaa, android-dokumentaatio viittaa siihen, että sinun pitäisi, mutta ei anna yksityiskohtaista selitystä sille tai miksi hyvät / huonot puolet eivätkä laajenna ja tee kaikkea toteuttamalla omat GLSurfaceView.Renderer
kuten minäkin
Silti, valtava määrä kysymyksiä, joissa ongelma liittyy puhtaasti GLSurfaceView
saa minut miettimään, onko oikeastaan todella hyviä syitä tehdä niin tällä tavoin kuin tapalla, jolla olen tehnyt sen (ja ehdotan vastauksissani muille tekemistä).
Onko siis jotain Minulta puuttuu? Pitäisikö minun lopettaa vastaaminen kysymyksiin tällä välin?
Kommentit
- mukava kysymys, josta olen kiinnostunut vastauksesta ..
- Yksi syy miksi laajentaa GLSurfaceView-ohjelmaa löytyy täältä: gamedev. stackexchange.com/questions/12629/… Ymmärtämättä sitä, olen jo ohittanut tässä kysymyksessä puhutut kysymykset omassa sovelluksessani lataamalla tekstuurit uudelleen jne.
onResume()
vastaus
Minulla on hyvin vähän laajennuksia GLSurfaceView
, ja suurin osa viisaudesta kuuluu GLSurfaceView.Renderer
-sovellukseni toteuttamiseen. Minulla oli seuraavat kolme syytä käyttää kääriä GLSurfaceView
:
-
Perusta
GLSurfaceView
ei tarjoa tapaa palauttaaRenderer
-instanssia. Minulla on useita pintoja, ja kun saan käyttöliittymän tapahtuman yhdelle niistä, haluan välittää komennon vastaavalle renderöijälle. Joten ohitansetRenderer
ja pidän viitteen laajennetussa luokassa. -
GLSurfaceView.Renderer
ei vastaanota ilmoituksiaonDetachedFromWindow()
taisurfaceDestroyed()
. Tämä aiheutti joitain ongelmia toteutuksessani. LaajennukseniGLSurfaceView
ohittaa nämä menetelmät ja antaa mRenderer tietää. Se on mahdollista § 1 . -
Jotkut menetelmät ovat kääritty vain lisäämään
try { super.
mikä tahansa; } catch() { log(
mitä tahansa) }
. EsimerkiksiqueueEvent()
heittää, jos Rendereriä ei ole asetettu; mutta minulle se on OK yksinkertaisesti ohita tällaiset aikajanan epäjohdonmukaisuudet.
Kommentit
Vastaa
Ainakin yksi hyvä syy GLSurfaceView: n laajentamiseen on pystyä luomaan se suoraan xml-asettelutiedostosta, kuten kaikki muutkin widgetit:
<RelativeLayout ... > <com.example.MyGlSurfaceView android:id="@+id/my_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" /> </RelativeLayout>
Kommentit
- Voit tehdä sen joka tapauksessa käyttämällä
<android.opengl.GLSurfaceView android:id="@+id/graphics_glsurfaceview1" android:layout_width="fill_parent" android:layout_height="fill_parent" />
- hyvää. Erona on, että esimerkissäni Android-kehys täyttää ja asentaa kaiken tarvitsematta ylimääräisiä koodirivejä. Menetelmäsi on enemmän koodia, mutta joustava korvaamaan toteutuksen. Sen lisäksi molemmat tavat näyttävät samanlaisilta.
Vastaa
No … GLSurfaceView on, kuten minä varmista, että olet huomannut, vain kääre yleisen edun hyväksi. Se sisältää kaikki toiminnot, jotka sinun on tehtävä renderöitäväksi opengl: llä, ja mahdollisuus sisällyttää se hienosti android View -hierarkiaan.
Et antanut vaihtoehtosi, joten sitä on mahdotonta verrata, mutta toivon, että synnyit toisen säikeen renderöintiin, kuten GLSurfaceView tekee, tai käyttäjän syötteet saattavat viivästyä.
Joten vielä kerran: GLSurfaceView tarjoaa uuden ketjun renderointia varten, joten sinun ei tarvitse huolehtia käyttäjän syöttöviiveestä
kommentit
- kyllä, mutta
GLSurfaceView
tekee sen (aloittaa renderöintiketjun), vaikka et laajenna sitä '. KäytänGLSurfaceView
, mutta en jatka sitä '. <
kysyn, mitä hyötyä on sen laajentamisesta ja siinä olevien eri menetelmien ohittamisesta sen sijaan, että kaikki olisi vain Renderer
GLSurfaceView
kuinGLSurfaceView.Renderer
. Vaikka kohdassa 1 pidän renderöijää muuttujana toiminnassani. Teoriassa saan sen mistä tahansa heittämällä kontekstin:((MyActivity)view.getContext()).getRenderer()
. Ehkä hieman vaarallisempi, koska asiayhteysobjekti ei välttämättä ole välttämättäMyActivity