Yüzey nesneleri, uygulamaların görüntüleri ekranlarda sunulmak üzere oluşturmasını sağlar. SurfaceHolder arayüzleri, uygulamaların yüzeyleri düzenlemesini ve kontrol etmesini sağlar.
Yüzey
Yüzey , üreticinin tüketiciyle tampon alışverişi yapması için bir arayüzdür.
Bir görüntüleme yüzeyi için BufferQueue, tipik olarak üçlü arabelleğe alma için yapılandırılır. Arabellekler talep üzerine tahsis edilir, bu nedenle üretici arabellekleri 60 fps'lik bir ekranda 30 fps'de olduğu gibi yeterince yavaş oluşturursa, kuyrukta yalnızca iki ayrılmış arabellek olabilir. Arabellekleri isteğe bağlı olarak tahsis etmek, bellek tüketimini en aza indirmeye 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üzeylerde işleme yapar. Ancak, bazı istemciler bir tuval kullanarak yüzeylere işleme yapar.
Tuval oluşturma
Tuval uygulaması Skia Grafik Kitaplığı tarafından sağlanır. Bir dikdörtgen çizmek istiyorsanız, bir arabellekteki baytları uygun şekilde ayarlayan Canvas API'sini çağırırsınız. Bir arabelleğin iki istemci tarafından aynı anda güncellenmediğinden veya görüntülenirken yazılmadığından emin olmak için, arabelleğe erişmek için arabelleği kilitleyin. Tuval kilitleriyle çalışmak için aşağıdaki komutları kullanın:
-
lockCanvas()
, CPU'da işleme 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 besteciye gönderir. -
lockHardwareCanvas()
, GPU'da işleme için arabelleği kilitler ve çizim için kullanılacak bir tuval döndürür.
Üretici bir BufferQueue'dan ilk arabellek istediğinde, arabellek tahsis edilir ve sıfıra başlatılır. İşlemler arasında yanlışlıkla veri paylaşımını önlemek için başlatma gereklidir. Ancak, bir arabelleği yeniden kullanırsanız, önceki içerikler hala mevcuttur. Hiçbir şey çizmeden arka arkaya lockCanvas()
ve unlockCanvasAndPost()
, üretici önceden oluşturulmuş kareler arasında geçiş yapar.
Yüzey kilitleme/kilit açma kodu, daha önce oluşturulmuş arabelleğe bir referans tutar. Yüzeyi kilitlerken kirli bir bölge belirtirseniz, önceki tampondan kirli olmayan pikselleri kopyalar. SurfaceFlinger veya HWC tipik olarak arabelleği işler; ancak yalnızca arabellekten okumamız gerektiğinden, özel erişim için beklemeye gerek yoktur.
Yüzey Tutucu
SurfaceHolder , sistemin yüzeylerin sahipliğini uygulamalarla paylaşmak için kullandığı bir arabirimdir. Yüzeylerle çalışan bazı istemciler bir SurfaceHolder ister, çünkü yüzey parametrelerini almak ve ayarlamak için API'ler bir SurfaceHolder aracılığıyla uygulanır. Bir SurfaceView , bir SurfaceHolder içerir.
Bir görünümle etkileşime giren çoğu bileşen bir SurfaceHolder içerir. MediaCodec gibi bazı diğer API'ler, yüzeyin kendisinde çalışır.