Pertanyaan ini sebagian teknis, sebagian meta, sebagian subjektif dan sangat spesifik:
Saya seorang pengembang game indie yang bekerja di android, dan selama 6 bulan terakhir saya telah berjuang dan akhirnya berhasil membuat aplikasi game 3D saya sendiri untuk android. Jadi saya pikir saya akan melompat pada SO dan membantu orang lain yang berjuang dengan android dan openGL-ES
Namun, sebagian besar pertanyaan terkait dengan perluasan GLSurfaceView
. Saya membuat seluruh aplikasi saya tanpa memperpanjang GLSurfaceView
(dan itu berjalan dengan baik). Saya tidak dapat melihat alasan apa pun untuk memperluas GLSurfaceView
sebagian besar pertanyaan yang saya temui.
Lebih buruk lagi, dokumentasi android menyiratkan bahwa Anda seharusnya, tetapi tidak memberikan penjelasan rinci tentang mengapa atau apa pro / kontra vs tidak memperluas dan melakukan segala sesuatu melalui menerapkan milik Anda GLSurfaceView.Renderer
seperti yang saya lakukan.
Namun, banyaknya pertanyaan di mana masalahnya murni berkaitan dengan perpanjangan GLSurfaceView
membuat saya bertanya-tanya apakah sebenarnya ada beberapa alasan yang sangat baik untuk melakukannya seperti itu vs cara saya telah melakukannya (dan menyarankan jawaban saya kepada orang lain melakukan).
Jadi, apakah ada sesuatu yang saya lewatkan? Haruskah saya berhenti menjawab pertanyaan sementara?
onResume()
Jawaban:
Saya memiliki ekstensi yang sangat minimal untuk saya
GLSurfaceView
, dan sebagian besar kebijaksanaan milik implementasi sayaGLSurfaceView.Renderer
. Saya memiliki tiga alasan berikut untuk menggunakan pembungkus untukGLSurfaceView
:Pangkalan
GLSurfaceView
tidak memberikan cara untuk mendapatkanRenderer
instance kembali. Saya memiliki beberapa permukaan, dan ketika saya menerima acara UI untuk salah satunya, saya ingin meneruskan perintah ke renderer yang sesuai. Jadi, saya menggantisetRenderer
dan menyimpan referensi di kelas saya.GLSurfaceView.Renderer
tidak menerima pemberitahuan untukonDetachedFromWindow()
atausurfaceDestroyed()
. Ini menyebabkan beberapa masalah pada implementasi saya. Ekstensi sayaGLSurfaceView
menimpa metode ini dan memberi tahu mRenderer . Itu mungkin karena §1 .Beberapa metode hanya dibungkus untuk menambahkan
try { super.
apa; } catch() { log(
pun apa pun) }
. Misalnya,queueEvent()
akan melempar jika Renderer tidak disetel; tetapi bagi saya, tidak apa-apa untuk mengabaikan inkonsistensi garis waktu seperti itu.sumber
GLSurfaceView
daripadaGLSurfaceView.Renderer
. Meskipun pada poin 1, saya menjadikan renderer sebagai variabel dalam aktivitas saya. Secara teori saya bisa mendapatkannya dari mana saja dengan casting konteks:((MyActivity)view.getContext()).getRenderer()
. Mungkin sedikit lebih berbahaya karena objek konteks mungkin tidak selaluMyActivity
Setidaknya satu alasan bagus untuk memperluas GLSurfaceView adalah untuk dapat membuat instantiate langsung dari file layout xml, sama seperti widget lainnya:
sumber
<android.opengl.GLSurfaceView android:id="@+id/graphics_glsurfaceview1" android:layout_width="fill_parent" android:layout_height="fill_parent" />
Yah ... GLSurfaceView adalah, seperti yang saya yakin Anda perhatikan, hanya pembungkus untuk kebaikan bersama. Ini merangkum semua fungsi yang perlu di-render dengan opengl, memiliki opsi untuk menggabungkannya dengan baik dengan hierarki tampilan android.
Anda tidak memberikan alternatif Anda sehingga tidak mungkin untuk membandingkan, tapi saya harap Anda menelurkan utas lain untuk rendering seperti yang dilakukan GLSurfaceView, atau input pengguna Anda mungkin tertinggal.
Jadi sekali lagi: GLSurfaceView menyediakan utas baru untuk rendering, jadi Anda tidak perlu khawatir tentang lag input pengguna
sumber
GLSurfaceView
apakah itu (memulai utas render) meskipun Anda tidak memperpanjangnya. Saya menggunakanGLSurfaceView
, tapi saya tidak memperpanjangnya. Saya bertanya manfaat apa yang didapat dari memperpanjangnya dan mengesampingkan metode yang berbeda di dalamnya sebagai lawan dari hanya memiliki semua yang ada diRenderer