Yüzey ve Yüzey Tutucu

Yüzey nesneleri, uygulamaların ekranlarda sunulacak görüntüleri oluşturmasını sağlar. SurfaceHolder arayüzleri, uygulamaların yüzeyleri düzenlemesine ve kontrol etmesine olanak tanır.

Yüzey

Yüzey, üreticinin tüketiciyle tampon alışverişinde bulunduğu bir arayüzdür.

Bir ekran yüzeyi için BufferQueue genellikle üçlü ara belleğe alma için yapılandırılır. Tamponlar talep üzerine tahsis edilir, dolayısıyla eğer yapımcı arabellekleri yeterince yavaş üretirse (örneğin, 60 fps'lik bir ekranda 30 fps'de), kuyrukta yalnızca iki tahsis edilmiş arabellek olabilir. Tamponların isteğe bağlı olarak tahsis edilmesi, bellek tüketiminin en aza indirilmesine yardımcı olur. dumpsys SurfaceFlinger çıktısında her katmanla ilişkili arabelleklerin bir özetini görebilirsiniz.

Çoğu istemci OpenGL ES veya Vulkan kullanarak yüzeyler üzerinde görüntü oluşturur. Ancak bazı istemciler yüzeyler üzerinde tuval kullanarak görüntü oluşturur.

Tuval oluşturma

Kanvas uygulaması Skia Grafik Kütüphanesi tarafından sağlanmaktadır. Bir dikdörtgen çizmek istiyorsanız arabellekteki baytları uygun şekilde ayarlayan Canvas API'sini çağırırsınız. Bir arabelleğin aynı anda iki istemci tarafından güncellenmediğinden veya görüntülenirken ara belleğe yazılmadığından emin olmak için, arabelleğe erişmek üzere arabelleği kilitleyin. Kanvas kilitlerle çalışmak için aşağıdaki komutları kullanın:

  • lockCanvas() CPU üzerinde görüntü oluşturmak için arabelleği kilitler ve çizim için kullanılacak bir Canvas döndürür.
  • unlockCanvasAndPost() arabelleğin kilidini açar ve onu derleyiciye gönderir.
  • lockHardwareCanvas() GPU'da görüntü oluşturmak için arabelleği kilitler ve çizim için kullanılacak bir tuval döndürür.

Üretici, BufferQueue'dan ilk kez bir arabellek talep ettiğinde, arabellek tahsis edilir ve sıfır olarak başlatılır. İşlemler arasında yanlışlıkla veri paylaşımının önlenmesi için başlatma gereklidir. Ancak arabelleği yeniden kullanırsanız önceki içerikler hâlâ mevcuttur. Hiçbir şey çizmeden lockCanvas() ve unlockCanvasAndPost() tekrar tekrar çağırırsanız, yapımcı önceden oluşturulmuş kareler arasında geçiş yapar.

Yüzey kilitleme/kilit açma kodu, daha önce oluşturulan ara belleğe bir referans tutar. Yüzeyi kilitlerken kirli bir bölge belirtirseniz, kirli olmayan pikselleri önceki arabellekten kopyalar. SurfaceFlinger veya HWC genellikle arabelleği işler; ancak yalnızca arabellekten okumamız gerektiğinden, özel erişimi beklememize gerek yok.

Yüzey Tutucu

SurfaceHolder, sistemin yüzeylerin sahipliğini uygulamalarla paylaşmak için kullandığı bir arayüzdür. Yüzeylerle çalışan bazı istemciler bir SurfaceHolder ister çünkü yüzey parametrelerini almaya ve ayarlamaya yönelik API'ler bir SurfaceHolder aracılığıyla uygulanır. SurfaceView bir SurfaceHolder içerir.

Bir görünümle etkileşime giren çoğu bileşen bir SurfaceHolder içerir. MediaCodec gibi diğer bazı API'ler yüzeyin kendisinde çalışır.