Android, OpenGL ve genişletme GLSurfaceView?


12

Bu soru kısmen teknik, kısmen meta, kısmen öznel ve çok özeldir:

Android'de çalışan bir indie oyun geliştiriciyim ve son 6 ay boyunca mücadele ettim ve sonunda android için kendi 3D oyun uygulamamı yapmayı başardım. Bu yüzden SO'ya atlayacağımı ve android ve openGL-ES ile mücadele eden diğerlerine yardım edeceğimi düşündüm

Ancak, soruların büyük çoğunluğu genişleme ile ilgilidir GLSurfaceView. Uzatmadan tüm uygulamamı yaptım GLSurfaceView(ve iyi çalışıyor). Karşılaştığım GLSurfaceViewsoruların çoğunu uzatmak için hiçbir neden göremiyorum .

Daha da kötüsü, android belgeleme yapmanız gerektiğini ima eder, ancak artıları / eksileri vs kendi GLSurfaceView.Rendereryaptığım gibi kendi uygulayarak genişletmek ve her şeyi yapmak vs neden veya ne olduğunu ayrıntılı bir açıklama vermez

Yine de, sorunun tamamen genişletmeyle ilgili olduğu soruların hacmi, bunu yapmak GLSurfaceViewiçin gerçekten çok iyi bir neden olup olmadığını merak etmeme neden oluyor. yapmak).

Peki, kaçırdığım bir şey var mı? Bu arada soruları cevaplamayı bırakmalı mıyım?

Android openGL belgeleri


güzel soru cevap meraklıyım ..
Tofeeq

GLSurfaceView uzatmak neden olarak bir nedeni burada bulabilirsiniz: gamedev.stackexchange.com/questions/12629/... farkında olmadan, ben aslında zaten dokular vb yeniden yükleyerek kendi uygulamasında bu söz konusu ettiği hususlar kaçınmaklaonResume()
Kaşık Başparmak

Yanıtlar:


2

Benim için çok az bir uzantım var GLSurfaceViewve bilgeliğin çoğu benim uygulamama ait GLSurfaceView.Renderer. Bir sarıcı kullanmak için aşağıdaki üç nedenim vardı GLSurfaceView:

  1. Taban GLSurfaceView, Rendererörneği geri almanın bir yolunu sunmaz. Birden fazla yüzeyim var ve bunlardan biri için bir UI olayı aldığımda, komutu karşılık gelen oluşturucuya geçirmek istiyorum. Bu nedenle, setRendererreferansı geçersiz kıldım ve genişletilmiş sınıfımda tutuyorum.

  2. GLSurfaceView.RendereronDetachedFromWindow()veya için bildirim almaz surfaceDestroyed(). Bu benim uygulamamda bazı sorunlara neden oldu. Benim uzantısı GLSurfaceViewbu yöntemleri geçersiz kılar ve mRenderer bilmesini sağlar. §1 yüzünden mümkün .

  3. Bazı yöntemler sadece try { super.ne ; } catch() { log(olursa olsun eklemek için sarılır ) }. Örneğin, queueEvent()Oluşturucu ayarlanmamışsa atar; ama benim için bu tür zaman çizelgesi tutarsızlıklarını görmezden gelmek sorun değil


Sorusu daha bir genişletilmiş gerçek mantığı koymak olabilir neden hedefleniyor rağmen ben de bu takındın bile GLSurfaceViewziyade GLSurfaceView.Renderer. 1. noktaya rağmen oluşturucuyu aktivitemde bir değişken olarak tutuyorum. Teoride ben bağlamı döküm yoluyla herhangi bir yerden alabilirsiniz: ((MyActivity)view.getContext()).getRenderer(). Bağlam nesnesi olmayabilir belki de biraz daha tehlikeliMyActivity
Spoon Thumb

Bir renderörünüz varsa sorun değil. Ama daha önce söylediğim gibi, çok sayıda rendercımız var ve farklı SurfaceView'lere bağlanıyorlar - bir karmaşa!
Alex Cohn

0

GLSurfaceView'ı genişletmek için en az bir iyi neden, onu diğer bir widget gibi doğrudan bir düzen xml dosyasından başlatabilmektir:

    <RelativeLayout ... >
      <com.example.MyGlSurfaceView
        android:id="@+id/my_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
      />
     </RelativeLayout>

1
Bunu kullanarak yine de yapabilirsiniz<android.opengl.GLSurfaceView android:id="@+id/graphics_glsurfaceview1" android:layout_width="fill_parent" android:layout_height="fill_parent" />
Spoon Thumb

İyi bir nokta. Fark, benim örneğimde, Android çerçevesinin ekstra kod satırlarına ihtiyaç duymadan her şeyi şişirip kurmasıdır. Yönteminiz daha fazla koddur, ancak uygulamanın yerini almak için esnektir. Bunun dışında her iki yol da benzer görünüyor.
Amir Uval

-1

...Ey ... GLSurfaceView, fark ettiđiniz gibi, ortak iyilik için bir sarýcý. Android View hiyerarşisine güzel bir şekilde dahil olma seçeneğine sahip olan, opengl ile oluşturması gereken tüm işlevleri içerir.

Alternatifinizi vermediniz, bu yüzden karşılaştırmak imkansız, ancak umarım GLSurfaceView gibi render için başka bir iş parçacığı oluşturdunuz veya kullanıcı girişiniz gecikebilir.

Tekrar: GLSurfaceView, oluşturma için yeni bir iş parçacığı sağlar, böylece kullanıcı giriş gecikmesi hakkında endişelenmenize gerek yoktur


2
Evet, ancak GLSurfaceViewgenişletmeseniz bile bunu yapar (oluşturma iş parçacığını başlatır). Kullanıyorum GLSurfaceViewama uzatmıyorum. Ben faydaları sadece sahip her şey tersine onu uzanan ve oradaki farklı yöntemler overrriding orada ne soruyorumRenderer
Kaşık Thumb

welp, denedim :) Daha sonra içine bakmak olabilir, şimdi ben de ilgileniyorum!
Greg
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.