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.
Surface
Yüzey, üreticinin arabellekleri tüketiciyle değiştirmesi için kullanılan bir arayüzdür.
Görüntüleme yüzeyleri genellikle üçlü arabellek için yapılandırılmış BufferQueue'ları kullanı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 arabellek ayırmak, bellek tüketimini en aza indirmeye yardımcı olur. dumpsys SurfaceFlinger
çıkışındaki her katmanla ilişkili arabelleklerin özetini görebilirsiniz.
Çoğu istemci, yüzeyleri OpenGL ES veya Vulkan kullanarak oluşturur. Ancak bazı istemciler, tuval kullanarak yüzeylere render işlemi uygular.
Kanvas oluşturma
Tuval uygulaması Skia Graphics Library tarafından sağlanır. Dikdörtgen çizmek istiyorsanız Canvas API'yi çağırırsınız. Bu API, arabellekteki baytları uygun şekilde ayarlar. Bir arabelleğin aynı anda iki istemci tarafından güncellenmemesi veya görüntülenirken üzerine yazılmaması 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 Canvas döndürür.unlockCanvasAndPost()
arabelleğin kilidini açar ve birleştiriciye 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 arabellek istediğinde arabellek ayrılır ve sıfır olarak başlatılır. İşlemler arasında verilerin yanlışlıkla paylaşılmasını önlemek için başlatma işlemi gereklidir. Ancak bir arabelleği yeniden kullanırsanız önceki içerikler yine de mevcut olur. lockCanvas()
ve unlockCanvasAndPost()
tuşlarına art arda basıp hiçbir şey çizmeden beklerseniz yapımcı, daha önce 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 önceki arabellekteki kirli olmayan pikselleri kopyalar. SurfaceFlinger veya HWC genellikle arabelleği işler ancak arabellekten yalnızca okuma yapmanız gerektiği için özel erişim için beklemenize 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 alma ve ayarlama API'leri bir SurfaceHolder aracılığıyla uygulandığından SurfaceHolder ister. SurfaceView, SurfaceHolder içerir.
Bir görünümle etkileşime giren bileşenlerin çoğu SurfaceHolder'ı içerir. MediaCodec gibi diğer bazı API'ler yüzeyin kendisinde çalışır.