Surface ve SurfaceHolder

Yüzey nesneleri, uygulamaların ekranlarda gösterilecek resimleri 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 arabellek alışverişi yapmasına olanak tanıyan bir arayüzdür.

Ekran yüzeyi için BufferQueue genellikle üçlü arabelleğe alma için yapılandırılır. Arabellekler isteğe bağlı olarak ayrılır. Bu nedenle, üretici arabellekleri yeterince yavaş oluşturursa (ör. 60 fps'lik bir ekranda 30 fps) kuyrukta yalnızca iki ayrılmış arabellek olabilir. İsteğe bağlı olarak arabelleğe ayırma, bellek tüketimini en aza indirmeye yardımcı olur. dumpsys SurfaceFlinger çıkışındaki her katmanla ilişkili arabelleklerin özetini görebilirsiniz.

Çoğu istemci, OpenGL ES veya Vulkan kullanarak yüzeylere oluşturma yapar. Ancak bazı istemciler, kanvas kullanarak yüzeylere oluşturma işlemi uygular.

Kanvas oluşturma

Tuval uygulaması Skia Grafik Kitaplığı tarafından sağlanır. Bir dikdörtgen çizmek istiyorsanız Canvas API'yi çağırırsınız. Bu API, baytları arabellekte uygun şekilde ayarlar. Bir arabelleğin iki istemci tarafından aynı anda güncellenmemesini veya görüntülenirken üzerine yazılmamasını sağlamak için arabelleğe erişmek üzere arabelleği kilitleyin. Tuval kilitleriyle çalışmak için aşağıdaki komutları kullanın:

  • lockCanvas(), CPU'da oluşturma için arabelleği kilitler ve çizim için kullanılacak bir tuval döndürür.
  • unlockCanvasAndPost(), arabelleğin kilidini açar ve arabelleği birleşim düzenleyiciye gönderir.
  • lockHardwareCanvas(), GPU'da oluşturma için arabelleği kilitler ve çizim için kullanılacak bir tuval döndürür.

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

Yüzey kilitleme/kilit açma kodu, daha önce oluşturulan arabelleğe referans tutar. Yüzeyi kilitlerken kirli bir bölge belirtirseniz kirli olmayan pikseller önceki arabellekten kopyalanır. SurfaceFlinger veya HWC genellikle arabelleği işler. Ancak yalnızca arabellekten okumamız gerektiğinden özel erişimi beklemeye gerek yoktur.

SurfaceHolder

SurfaceHolder, sistemin yüzeylerin sahipliğini uygulamalarla paylaşmak için kullandığı bir arayüzdür. Yüzeylerle çalışan bazı istemciler, yüzey parametrelerini almak ve ayarlamak için kullanılan API'ler SurfaceHolder aracılığıyla uygulandığından SurfaceHolder ister. SurfaceView, bir SurfaceHolder içerir.

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