Questa domanda è in parte tecnica, in parte meta, in parte soggettiva e molto specifica:
Sono uno sviluppatore di giochi indie lavorando su Android, e negli ultimi 6 mesi ho lottato e finalmente sono riuscito a creare la mia app di gioco 3D per Android. Quindi ho pensato di “saltare su SO e aiutare gli altri alle prese con Android e openGL-ES
Tuttavia, la stragrande maggioranza delle domande si riferisce allestensione di GLSurfaceView
. Ho creato la mia intera app senza estendere GLSurfaceView
(e funziona correttamente). Non vedo alcun motivo per estendere GLSurfaceView
per la maggior parte delle domande che incontro.
Peggio ancora, la documentazione di Android implica che dovresti farlo, ma non fornisce spiegazioni dettagliate sul perché o quali sono i pro / contro rispetto al non estendere e fare tutto implementando il tuo GLSurfaceView.Renderer
come ho fatto io
Tuttavia, lenorme volume di domande in cui il problema ha esclusivamente a che fare con lestensione di GLSurfaceView
mi sta facendo chiedere se effettivamente ci sia qualche buona ragione per farlo in quel modo rispetto a come lho fatto io (e suggerendo nelle mie risposte agli altri di farlo).
Quindi, cè qualcosa Mi manca? Devo smettere di rispondere alle domande nel frattempo?
Documentazione di Android openGL
Commenti
- bella domanda che mi interessa rispondere ..
- Un motivo per estendere GLSurfaceView può essere trovato qui: gamedev. stackexchange.com/questions/12629/… Senza rendermene conto, in realtà ho già eluso i problemi di cui si parla in questa domanda nella mia app ricaricando le trame, ecc
onResume()
Risposta
Ho unestensione minima per il mio GLSurfaceView
e la maggior parte della saggezza appartiene alla mia implementazione di GLSurfaceView.Renderer
. Avevo i seguenti tre motivi per utilizzare un wrapper per GLSurfaceView
:
-
Il
GLSurfaceView
non fornisce alcun modo per recuperare listanzaRenderer
. Ho più superfici e quando ricevo un evento dellinterfaccia utente per una di esse, voglio passare il comando al renderer corrispondente. Quindi, sovrascrivosetRenderer
e mantengo il riferimento nella mia classe estesa. -
GLSurfaceView.Renderer
non riceve notifiche peronDetachedFromWindow()
osurfaceDestroyed()
. Ciò ha causato alcuni problemi alla mia implementazione. La mia estensione diGLSurfaceView
sostituisce questi metodi e comunica a mRenderer . È possibile grazie a § 1 . -
Alcuni metodi vengono inseriti solo per aggiungere
try { super.
qualunque; } catch() { log(
qualunque cosa) }
. Ad esempio,queueEvent()
lancerà se Renderer non è impostato; ma per me va bene ignora semplicemente tali incongruenze nella sequenza temporale.
Commenti
Answer
Almeno un buon motivo per estendere GLSurfaceView è essere in grado di istanziarlo direttamente da un file xml di layout, proprio come qualsiasi altro 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>
Commenti
- Puoi farlo comunque usando
<android.opengl.GLSurfaceView android:id="@+id/graphics_glsurfaceview1" android:layout_width="fill_parent" android:layout_height="fill_parent" />
- Buona osservazione. La differenza è che nel mio esempio il framework Android gonfia e imposta tutto senza bisogno di righe di codice aggiuntive. Il tuo metodo è più codice, ma flessibile per sostituire limplementazione. A parte questo, entrambi i modi sembrano simili.
Risposta
Bene … GLSurfaceView è, come me certo che hai notato, è solo un wrapper per il bene comune. Incapsula tutte le funzionalità necessarie per il rendering con opengl, avendo la possibilità di incorporarlo perfettamente con la gerarchia di Android View.
Non hai fornito la tua alternativa quindi è impossibile confrontare, ma spero che tu abbia generato un altro thread per il rendering come fa GLSurfaceView, o linput dellutente potrebbe essere in ritardo.
Quindi ancora: GLSurfaceView fornisce un nuovo thread per il rendering, quindi non devi preoccuparti del ritardo di input dellutente
Commenti
- Sì, ma
GLSurfaceView
lo fa (avvia un thread di rendering) anche se non ' estenderlo. UsoGLSurfaceView
, ma non ' per estenderlo. ' sto chiedendo quali vantaggi ci sono dallestenderlo e ignorare i diversi metodi in esso contenuti invece di avere tutto nelRenderer
- welp, ho provato 🙂 Potrei esaminarlo più tardi, ora mi interessa anche!
GLSurfaceView
esteso piuttosto che inGLSurfaceView.Renderer
. Anche se al punto 1, mantengo il renderer come variabile nella mia attività. In teoria posso ottenerlo da qualsiasi luogo trasmettendo il contesto:((MyActivity)view.getContext()).getRenderer()
. Forse un po più pericoloso in quanto loggetto contesto potrebbe non essere necessariamenteMyActivity