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

  • întrebare drăguță, sunt interesat de răspunsuri.
  • Un motiv pentru care extindeți GLSurfaceView poate fi găsit aici: gamedev. stackexchange.com/questions/12629/… Fără să-mi dau seama, am ignorat deja problemele despre care am vorbit în această întrebare în propria aplicație reîncărcând texturi etc. onResume()

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:

  1. Baza GLSurfaceView nu oferă nicio modalitate de a recupera instanța Renderer. 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, înlocuiesc setRenderer și păstrez referința în clasa mea extinsă.

  2. GLSurfaceView.Renderer nu primește notificări pentru onDetachedFromWindow() sau surfaceDestroyed(). Acest lucru a cauzat unele probleme implementării mele. Extensia mea a GLSurfaceView suprascrie aceste metode și permite mRenderer să știe. Este posibil din cauza § 1 .

  3. 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 în GLSurfaceView.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ărat MyActivity
  • 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. Folosesc GLSurfaceView, 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 în Renderer
  • welp, am încercat 🙂 S-ar putea să mă uit la el mai târziu, acum sunt și interesat!

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *