SurfaceView ve GLSurfaceView

Android uygulama çerçevesi kullanıcı arabirimi, bir Görünüm ile başlayan nesnelerin bir hiyerarşisine dayanır. Tüm UI öğeleri, bir dizi ölçümden ve bunları dikdörtgen bir alana sığdıran bir düzen sürecinden geçer. Ardından, tüm görünür görünüm nesneleri, uygulama ön plana getirildiğinde WindowManager tarafından oluşturulan bir yüzeye işlenir. Uygulamanın UI iş parçacığı, çerçeve başına arabelleğe göre düzen ve işleme gerçekleştirir.

SurfaceView

SurfaceView, görünüm hiyerarşinize ek bir bileşik katman yerleştirmek için kullanabileceğiniz bir bileşendir. Bir SurfaceView, diğer görünümlerle aynı mizanpaj parametrelerini alır, bu nedenle diğer görünümler gibi değiştirilebilir, ancak SurfaceView içeriği şeffaftır.

GL bağlamı veya ortam kod çözücü gibi harici bir arabellek kaynağıyla render ettiğinizde, arabellekleri ekranda görüntülemek için arabellek kaynağından arabellekleri kopyalamanız gerekir. SurfaceView kullanmak bunu yapmanızı sağlar.

SurfaceView'ın görünüm bileşeni görünür hale gelmek üzereyken, çerçeve SurfaceControl'den SurfaceFlinger'dan yeni bir yüzey talep etmesini ister. Yüzey oluşturulduğunda veya yok edildiğinde geri aramaları almak için SurfaceHolder arabirimini kullanın. Varsayılan olarak, yeni oluşturulan yüzey, uygulama kullanıcı arayüzü yüzeyinin arkasına yerleştirilir. Yeni yüzeyi en üste koymak için varsayılan Z sıralamasını geçersiz kılabilirsiniz.

SurfaceView ile işleme, Kamera API'si veya bir OpenGL ES bağlamı ile işlerken olduğu gibi ayrı bir yüzeye görüntülemeniz gereken durumlarda faydalıdır. SurfaceView ile oluşturduğunuzda, SurfaceFlinger doğrudan ekranda tamponlar oluşturur. SurfaceView olmadan, arabellekleri ekran dışı bir yüzeye birleştirmeniz gerekir, bu daha sonra ekranda birleştirilir, böylece SurfaceView ile oluşturma fazladan işi ortadan kaldırır. SurfaceView ile oluşturduktan sonra, etkinlik yaşam döngüsü ile koordinasyon sağlamak için UI iş parçacığını kullanın ve gerekirse görünümün boyutu veya konumunda ayarlamalar yapın. Ardından, Donanım Oluşturucu, uygulama kullanıcı arayüzünü ve diğer katmanları karıştırır.

Yeni yüzey, tüketicisi SurfaceFlinger katmanı olan BufferQueue'nun üretici tarafıdır. Yüzeyi, yüzeyden sağlanan Canvas işlevleri, EGLSurface ekleyerek ve GLES ile yüzey üzerinde çizim yapma veya yüzeyi yazmak için bir ortam kod çözücüsü yapılandırma gibi bir BufferQueue'yu besleyebilen herhangi bir mekanizma ile güncelleyebilirsiniz.

SurfaceView ve etkinlik yaşam döngüsü

Bir SurfaceView kullanırken, yüzeyi ana UI iş parçacığı dışındaki bir iş parçacığından oluşturun.

SurfaceView içeren bir etkinlik için, iki ayrı ancak birbirine bağlı durum makinesi vardır:

  • App onCreate / onResume / onPause
  • Yüzey oluşturuldu / değiştirildi / tahrip edildi

Etkinlik başladığında, geri aramaları şu sırayla alırsınız:

  1. onCreate()
  2. onResume()
  3. surfaceCreated()
  4. surfaceChanged()

Geri tıklarsanız, şunları elde edersiniz:

  1. onPause()
  2. surfaceDestroyed() (yüzey kaybolmadan hemen önce çağrılır)

Ekranı döndürürseniz, etkinlik parçalanır ve yeniden oluşturulur ve tam döngüyü elde edersiniz. isFinishing() kontrol ederek hızlı bir yeniden başlatma olduğunu söyleyebilirsiniz. Bir etkinliği o kadar hızlı başlatmak / durdurmak mümkündür ki, surfaceCreated() sonrasında onPause() .

Ekranı onPause() için güç düğmesine dokunursanız, onPause() olmadan yalnızca onPause() surfaceDestroyed() . Yüzey aktif kalır ve işleme devam edebilir. Talep etmeye devam ederseniz Koreograf etkinliklerini almaya devam edebilirsiniz. Farklı bir yönü zorlayan bir kilit ekranınız varsa, cihaz engeli kaldırıldığında etkinliğiniz yeniden başlatılabilir. Aksi takdirde, eskisi gibi aynı yüzeye sahip ekran boşluğundan çıkabilirsiniz.

İpin ömrü, ekran karardığında ne olmasını istediğinize bağlı olarak yüzeye veya aktiviteye bağlanabilir. İş parçacığı, Aktivite başlatma / durdurma veya yüzey oluşturma / yok etme sırasında başlayabilir / durdurulabilir.

İşlem başlatma / durdurma işleminin başlatılması / durdurulması, uygulama yaşam döngüsüyle iyi çalışır. Oluşturucu iş parçacığını onResume() içinde onResume() ve onStop() içinde onStop() . İş parçacığı oluştururken ve yapılandırırken bazen yüzey zaten vardır, diğer zamanlarda olmaz (örneğin, ekranı güç düğmesiyle açtıktan sonra hala etkindir). İş parçacığını başlatmadan önce yüzeyin yaratılmasını beklemelisiniz. surfaceCreate() geri surfaceCreate() başlatamazsınız çünkü yüzey yeniden oluşturulmazsa tekrar ateşlenmez. Bunun yerine, yüzey durumunu sorgulayın veya önbelleğe alın ve bunu oluşturucu iş parçacığına iletin.

Yüzey oluşturma / yok etme üzerinde iş parçacığı başlatma / durdurma olması iyi çalışır çünkü yüzey ve oluşturucu mantıksal olarak iç içe geçmiştir. İpliği yüzey oluşturulduktan sonra başlatırsınız, bu da bazı interthread iletişim endişelerini ortadan kaldırır; ve yüzeyde oluşturulan / değiştirilen mesajlar basitçe iletilir. Ekran karardığında işlemenin durduğundan emin olmak için, Koreografa çerçeve çekilişini çağırmayı bırakmasını söyleyin. onResume() , oluşturucu iş parçacığı çalışıyorsa geri aramaları sürdürür. Ancak, kareler arasında geçen süreye göre animasyon uygularsanız, sonraki olay gelmeden önce büyük bir boşluk olabilir; açık bir duraklama / devam etme mesajı kullanmak bu sorunu çözebilir.

Her iki seçenek de, iş parçacığının ömrü Aktiviteye veya yüzeye bağlı olsun, oluşturucu iş parçacığının nasıl yapılandırıldığına ve yürütülüp yürütülmediğine odaklanır. İlgili bir endişe, etkinlik onStop() iş parçacığından durum ayıklamaktır ( onStop() veya onSaveInstanceState() ); bu gibi durumlarda, iş parçacığının ömrünü etkinliğe bağlamak en iyi sonucu verir çünkü oluşturucu iş parçacığı birleştirildikten sonra, işlenen iş parçacığının durumuna senkronizasyon ilkelleri olmadan erişilebilir.

GLSurfaceView

GLSurfaceView sınıfı, EGL bağlamlarını yönetmek, interthread iletişimi ve etkinlik yaşam döngüsüyle etkileşimi yönetmek için yardımcı sınıflar sağlar. GLES'i kullanmak için GLSurfaceView kullanmanıza gerek yoktur.

Örneğin, GLSurfaceView, işleme için bir iş parçacığı oluşturur ve orada bir EGL bağlamı yapılandırır. Etkinlik durakladığında durum otomatik olarak temizlenir. Çoğu uygulamanın GLES'i GLSurfaceView ile kullanmak için EGL hakkında hiçbir şey bilmesine gerek yoktur.

Çoğu durumda, GLSurfaceView, GLES ile çalışmayı kolaylaştırabilir. Bazı durumlarda, yolunuza çıkabilir.