Această întrebare este parțial tehnică, parțial meta, parțial subiectivă și foarte specifică:
Sunt „dev un joc independent lucrez pe Android și, în ultimele 6 luni, m-am luptat și în cele din urmă am reușit să îmi creez propria aplicație de joc 3D pentru Android. Așa că m-am gândit să mă opresc la SO și să îi ajut pe ceilalți care se luptă cu Android și openGL-ES
Cu toate acestea, marea majoritate a întrebărilor se referă la extinderea GLSurfaceView
. Mi-am creat toată aplicația fără să extind GLSurfaceView
(și funcționează bine). Nu pot să văd niciun motiv pentru a extinde GLSurfaceView
pentru majoritatea întrebărilor pe care le întâlnesc.
Mai rău, documentația Android implică faptul că ar trebui să faceți acest lucru, dar nu oferă nicio explicație detaliată de ce sau ce sunt avantajele / dezavantajele față de faptul că nu extindeți și faceți totul prin implementarea propriilor GLSurfaceView.Renderer
așa cum am făcut
Totuși, volumul complet de întrebări în care problema este pur și simplu legată de extinderea GLSurfaceView
mă face să mă întreb dacă există de fapt vreun motiv foarte bun pentru a face acest lucru în comparație cu modul în care „am făcut-o (și am sugerat în răspunsurile mele celorlalți să o facă).
Deci, există ceva Lipsesc? Ar trebui să nu mai răspund la întrebări între timp?
Documentație openGL pentru Android
Comentarii
Răspuns
Am o extensie foarte mică pentru GLSurfaceView
, iar cea mai mare parte a înțelepciunii aparține implementării mele a GLSurfaceView.Renderer
. Am avut următoarele trei motive pentru a folosi un wrapper pentru GLSurfaceView
:
-
Baza
GLSurfaceView
nu oferă nicio modalitate de a recupera instanțaRenderer
. Am mai multe suprafețe și, când primesc un eveniment UI pentru una dintre ele, vreau să transmit comanda către randatorul corespunzător. Deci, înlocuiescsetRenderer
și păstrez referința în clasa mea extinsă. -
GLSurfaceView.Renderer
nu primește notificări pentruonDetachedFromWindow()
sausurfaceDestroyed()
. Acest lucru a cauzat unele probleme implementării mele. Extensia mea aGLSurfaceView
suprascrie aceste metode și permite mRenderer să știe. Este posibil din cauza § 1 . -
Unele metode sunt împachetate numai pentru a adăuga
try { super.
orice; } catch() { log(
orice) }
. De exemplu,queueEvent()
se va arunca dacă Renderer nu este setat; dar pentru mine, este OK să pur și simplu ignorați astfel de inconsecvențe ale cronologiei.
Comentarii
- I ' Am început să fac și acest lucru, deși întrebarea se adresează mai degrabă de ce ați putea pune logica reală într-un
GLSurfaceView
extins, mai degrabă decât înGLSurfaceView.Renderer
. Deși la punctul 1, păstrez randarea ca o variabilă în activitatea mea. În teorie, îl pot obține de oriunde aruncând contextul:((MyActivity)view.getContext()).getRenderer()
. Poate că un pic mai periculos, deoarece obiectul context nu poate fi neapăratMyActivity
- Este ' bine dacă aveți un singur redator. Dar, așa cum am spus mai devreme, avem multe randări, iar acestea se conectează la diferite SurfaceViews – o mizerie!
Răspuns
Cel puțin un motiv bun pentru extinderea GLSurfaceView este să îl puteți instanția direct dintr-un fișier XML de aspect, la fel ca orice alt 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>
Comentarii
- Puteți face asta oricum folosind
<android.opengl.GLSurfaceView android:id="@+id/graphics_glsurfaceview1" android:layout_width="fill_parent" android:layout_height="fill_parent" />
- Bun punct. Diferența este că, în exemplul meu, cadrul Android umflă și configurează totul fără a avea nevoie de linii suplimentare de cod. Metoda dvs. este mai mult cod, dar flexibilă pentru a înlocui implementarea. În afară de asta, ambele moduri par similare.
Răspuns
Ei bine … GLSurfaceView este, așa cum sunt sigur că ați observat, doar un wrapper pentru binele comun. Acesta încapsulează toate funcționalitățile pe care ar trebui să le redați cu opengl, având opțiunea de a le încorpora frumos cu ierarhia Android View.
Nu ați furnizat alternativa dvs., deci este imposibil de comparat, dar sper că ați generat un alt fir pentru redare, așa cum face GLSurfaceView, sau intrarea dvs. de utilizator ar putea să rămână.
Deci, din nou: GLSurfaceView oferă un nou fir pentru redare, deci nu trebuie să vă faceți griji cu privire la întârzierea de intrare a utilizatorului
Comentarii
- Da, dar
GLSurfaceView
face asta (pornește un fir de redare) chiar dacă ' nu îl extindeți. FolosescGLSurfaceView
, dar nu ' nu îl extind. ' mă întreb ce avantaje există dacă îl extindeți și să înlocuiți diferitele metode din acesta, opus doar pentru a avea totul înRenderer
- welp, am încercat 🙂 S-ar putea să mă uit la el mai târziu, acum sunt și interesat!
onResume()