Grafikler

Android Graphics HAL simgesi

Android çerçevesi, 2D ve 3D için çeşitli grafik oluşturma API'leri sunar. Bu API'ler, grafik sürücülerinin üretici uygulamalarıyla etkileşime girer. Bu nedenle, bu API'lerin daha üst düzeyde nasıl çalıştığını iyi anlamak önemlidir. Bu sayfada, söz konusu sürücülerin üzerinde oluşturulduğu grafik donanım soyutlama katmanı (HAL) tanıtılmaktadır. Bu bölüme devam etmeden önce aşağıdaki terimler hakkında bilgi edinin:

canvas (genel terim), Canvas (API öğesi)
Kanvas, gerçek bitlerin bir bit eşlem veya Surface nesnesiyle birleştirilmesini sağlayan bir çizim yüzeyidir. Canvas sınıfı; bit eşlemlerin, çizgilerin, dairelerin, dikdörtgenlerin, metinlerin vb. standart bilgisayar çizimi için yöntemlere sahiptir ve bir bit eşleme veya yüzeye bağlıdır. Tuval, ekranda 2 boyutlu nesneler çizmenin en basit ve kolay yoludur. Temel sınıf Canvas'dır.
çekilebilir
Çizilebilir öğe, arka plan, başlık veya ekranın başka bir bölümü olarak kullanılabilen derlenmiş bir görsel kaynaktır. Çizilebilir öğeler genellikle başka bir kullanıcı arayüzü öğesine (ör. arka plan resmi olarak) yüklenir. Çizilebilir öğeler etkinlik alamaz ancak durum ve planlama gibi çeşitli özellikleri atayarak animasyon nesneleri veya resim kitaplıkları gibi alt sınıfların etkinleştirilmesini sağlar. Çizilebilir nesnelerin çoğu, çizilebilir kaynak dosyalarından (XML veya resim dosyaları) yüklenir. Çizilebilir kaynaklar, android.graphics.drawable alt sınıflarına derlenir. Çizilebilir öğeler ve diğer kaynaklar hakkında daha fazla bilgi için Uygulama kaynaklarına genel bakış başlıklı makaleyi inceleyin.
düzen kaynağı
Düzen kaynağı, bir etkinlik ekranının düzenini açıklayan bir XML dosyasıdır. Daha fazla bilgi için Düzen kaynağı başlıklı makaleyi inceleyin.
dokuz yamalı (9 yamalı, NinePatch)
Dokuz yamalı resim, arka planlar veya cihazdaki diğer resimler için kullanılabilen, yeniden boyutlandırılabilir bir bit eşlem kaynağıdır. Daha fazla bilgi için Nine-patch konusuna bakın.
OpenGL ES
OpenGL ES, 2D ve 3D grafiklerin oluşturulması için kullanılan platformlar arası bir API'dir. Android, donanım hızlandırmalı 3D oluşturma için OpenGL ES kitaplıkları sağlar. 2D oluşturma için tuval daha basit bir seçenektir. OpenGL ES, Android Native Development Kit (NDK)'de kullanılabilir. android.opengl ve javax.microedition.khronos.opengles paketleri, OpenGL ES işlevini kullanıma sunar.
yüzey (genel terim), Surface (API öğesi)
Yüzey, ekranda birleştirilen bir bellek bloğunu temsil eder. Surface, çizim için bir tuval tutar ve katmanları çizmek ve Surface nesnesini yeniden boyutlandırmak için çeşitli yardımcı yöntemler sağlar. Doğrudan Surface sınıfı yerine SurfaceView sınıfını kullanın.
yüzey görünümü (genel terim), SurfaceView (API öğesi)
Yüzey görünümü, çizim için View nesnesini sarmalayan ve boyutunu ve biçimini dinamik olarak belirtmek için yöntemler sunan bir Surface nesnesidir. SurfaceView, oyunlar veya kamera önizlemeleri gibi kaynak yoğun işlemler için kullanıcı arayüzü iş parçacığından bağımsız olarak çizim yapma olanağı sunar ancak sonuç olarak ek bellek kullanır. Bir yüzey görünümü hem tuval hem de OpenGL ES grafiklerini destekler. SurfaceView nesnesinin temel sınıfı SurfaceView şeklindedir.
tema
Tema, çeşitli varsayılan görüntüleme ayarlarını tanımlamak için bir araya getirilmiş metin boyutu ve arka plan rengi gibi bir özellikler kümesidir. Android, R.style bölümünde listelenen ve Theme_ ile başlayan birkaç standart tema sunar.
görünüm (genel terim), View (API öğesi)
Görünüm, ekranda dikdörtgen bir alan çizer ve tıklama, tuş vuruşu ve diğer etkileşim etkinliklerini işler. View sınıfı, metin kutuları ve pencereler gibi bir etkinlik veya iletişim kutusu ekranının çoğu düzen bileşeni için temel sınıftır. Bir View nesnesi, kendini çizmek için üst nesnesinden çağrı alır (bkz. ViewGroup) ve üst nesnesini tercih ettiği boyut ve konum hakkında bilgilendirir. Bu bilgiler üst nesne tarafından dikkate alınmayabilir. Daha fazla bilgi için View sayfasına bakın.
görüntüleme grubu (genel terim), ViewGroup (API öğesi)
Görünüm grubu, bir dizi alt görünümü gruplandırır. Görüntü grubu, alt görünümlerin nereye yerleştirileceğine ve ne kadar büyük olabileceğine karar vermenin yanı sıra uygun olduğunda her birini kendilerini çizmeye çağırmaktan da sorumludur. Bazı görünüm grupları görünmezdir ve yalnızca düzen için kullanılır. Diğerlerinde ise kaydırma listesi kutusu gibi yerleşik bir kullanıcı arayüzü vardır. Görünüm grupları android.widget paketindedir ancak ViewGroup sınıfını genişletir.
görünüm hiyerarşisi
Görünüm hiyerarşisi, görünüm ve görünüm grubu nesnelerinin düzenlenmesiyle oluşturulur. Bu düzenleme, bir uygulamanın her bileşeni için kullanıcı arayüzünü tanımlar. Hiyerarşi, bir veya daha fazla alt görünüm ya da görünüm grubu içeren görünüm gruplarından oluşur. Android SDK ile birlikte gelen Hierarchy Viewer'ı kullanarak hata ayıklama ve optimizasyon için görünüm hiyerarşisinin görsel bir temsilini elde edebilirsiniz.
Vulkan
Vulkan, yüksek performanslı 3D grafikler için düşük ek yüke sahip, platformlar arası bir API'dir.
widget
Widget, form öğelerini ve metin kutusu ya da pop-up menü gibi diğer kullanıcı arayüzü bileşenlerini oluşturmak için kullanılan, tam olarak uygulanmış bir dizi görünüm alt sınıfından biridir. Bir widget tamamen uygulandığı için ölçüm, kendini çizme ve ekran etkinliklerine yanıt verme işlemlerini gerçekleştirir. Widget'lar android.widget paketinde yer alır.
window (genel terim), Window (API öğesi)
Android uygulamalarında pencere, genel bir pencerenin öğelerini (ör. görünüm ve tarz, başlık çubuğu metni, menülerin konumu ve içeriği) belirten Window soyut sınıfından türetilmiş bir nesnedir. İletişim kutuları ve etkinlikler, Window nesnesini oluşturmak için Window sınıfının bir uygulamasını kullanır. Window sınıfını uygulamanız veya uygulamanızda pencereler kullanmanız gerekmez.

Uygulama geliştiriciler, Canvas, OpenGL ES veya Vulkan ile üç şekilde ekrana görüntü çizer.

Android grafik bileşenleri

Geliştiriciler hangi oluşturma API'sini kullanırsa kullansın, her şey bir yüzey üzerinde oluşturulur. Yüzey, genellikle SurfaceFlinger tarafından kullanılan bir arabellek kuyruğunun üretici tarafını temsil eder. Android platformunda oluşturulan her pencere bir yüzeyle desteklenir. Görüntülenen tüm yüzeyler, SurfaceFlinger tarafından ekranda birleştirilir.

Aşağıdaki şemada, temel bileşenlerin birlikte nasıl çalıştığı gösterilmektedir:

görüntü oluşturma bileşenleri

Şekil 1. Yüzeyler nasıl oluşturulur?

Ana bileşenler aşağıdaki bölümlerde açıklanmıştır.

Görüntü akışı üreticileri

Görüntü akışı üreticisi, tüketim için grafik arabellekler üreten herhangi bir şey olabilir. OpenGL ES, Canvas 2D ve mediaserver video kod çözücüleri buna örnek olarak verilebilir.

Resim akışı tüketicileri

Görüntü akışlarının en yaygın tüketicisi, şu anda görünür olan yüzeyleri tüketen ve Pencere Yöneticisi tarafından sağlanan bilgileri kullanarak bunları ekranda birleştiren sistem hizmeti SurfaceFlinger'dir. SurfaceFlinger, ekranın içeriğini değiştirebilen tek hizmettir. SurfaceFlinger, bir grup yüzeyi oluşturmak için OpenGL ve Hardware Composer'ı (HWC) kullanır.

Diğer OpenGL ES uygulamaları da görüntü akışlarını kullanabilir. Örneğin, kamera uygulaması bir kamera önizleme görüntü akışını kullanır. GL dışı uygulamalar da tüketici olabilir. Örneğin, ImageReader sınıfı.

Donanım Composer

Ekran alt sistemi için donanım soyutlama. SurfaceFlinger, OpenGL ve GPU'nun iş yükünü azaltmak için belirli birleştirme işlerini HWC'ye devredebilir. SurfaceFlinger, yalnızca başka bir OpenGL ES istemcisi gibi davranır. Bu nedenle, SurfaceFlinger bir veya iki arabelleği etkin bir şekilde üçüncü bir arabellekte birleştirirken örneğin OpenGL ES kullanır. Bu durum, GPU'nun tüm hesaplamaları yapmasına kıyasla daha az güç tüketir.

İşin diğer yarısını Hardware Composer HAL yapar ve tüm Android grafik oluşturma işlemlerinin merkezi noktasıdır. HWC, etkinlikleri desteklemelidir. Bu etkinliklerden biri VSync'tir (diğeri, tak ve çalıştır HDMI desteği için hotplug'dır).

Gralloc

Grafik belleği ayırıcısının (Gralloc), görüntü üreticiler tarafından istenen belleği ayırması gerekir. Ayrıntılar için BufferQueue ve Gralloc başlıklı makaleyi inceleyin.

Veri akışı

Aşağıdaki şemada Android grafik ardışık düzeni gösterilmektedir:

grafik veri akışı

Şekil 2. Android'deki grafik veri akışı.

Soldaki nesneler, ana ekran, durum çubuğu ve sistem kullanıcı arayüzü gibi grafik arabellekleri oluşturan oluşturuculardır. SurfaceFlinger, birleştiricidir ve HWC de birleştiricidir.

BufferQueue

BufferQueue'lar, Android grafik bileşenleri arasında bağlantı sağlar. Bunlar, üreticiden tüketiciye sürekli olarak gönderilen arabellek döngüsüne aracılık eden bir sıra çiftidir. Üreticiler arabelleklerini teslim ettikten sonra SurfaceFlinger, her şeyi ekranda birleştirmekten sorumludur.

Aşağıdaki şemada BufferQueue iletişim süreci gösterilmektedir:

BufferQueue iletişim süreci

Şekil 3. BufferQueue iletişim süreci.

BufferQueue, görüntü akışı üreticilerini ve görüntü akışı tüketicilerini birbirine bağlayan mantığı içerir. Görüntü üreticilere örnek olarak kamera HAL'si tarafından üretilen kamera önizlemeleri veya OpenGL ES oyunları verilebilir. SurfaceFlinger veya OpenGL ES akışı görüntüleyen başka bir uygulama (ör. kamera vizörünü görüntüleyen kamera uygulaması) görüntü tüketicilere örnek olarak verilebilir.

BufferQueue, arabellek havuzunu kuyrukla birleştiren ve işlemler arasında arabellekleri geçirmek için Binder işlemleri arası iletişim (IPC) kullanan bir veri yapısıdır. Üretici arayüzü veya grafik arabellekler oluşturmak isteyen birine ilettiğiniz öğe, IGraphicBufferProducer (SurfaceTexture'nin bir parçası) şeklindedir. BufferQueue, diğer görevlerin yanı sıra genellikle bir Surface'e oluşturmak ve GLConsumer ile kullanmak için kullanılır.

BufferQueue üç farklı modda çalışabilir:

eşzamanlı benzeri mod
BufferQueue, varsayılan olarak eşzamanlı benzeri bir modda çalışır. Bu modda, üreticiden gelen her arabellek tüketiciye gönderilir. Bu modda hiçbir zaman arabellek atılmaz. Üretici çok hızlıysa ve arabellekleri boşaltılma hızından daha hızlı oluşturuyorsa arabellekler engellenir ve boş arabellekler beklenir.
engel koymayan mod
BufferQueue, bu durumlarda arabellek beklemek yerine hata oluşturan engellemeyen bir modda da çalışabilir. Bu modda hiçbir zaman arabellek atılmaz. Bu, grafik çerçevesinin karmaşık bağımlılıklarını anlamayabilecek uygulama yazılımlarında olası kilitlenmeleri önlemek için kullanışlıdır.
atılma modu
BufferQueue, hata oluşturmak veya beklemek yerine eski arabellekleri silmek üzere yapılandırılabilir. Örneğin, bir doku görünümüne GL oluşturma işlemi yapılıyorsa ve mümkün olduğunca hızlı çizim yapılıyorsa arabellekler bırakılmalıdır.

SurfaceFlinger, bu işin büyük bir kısmını yapmak için yalnızca başka bir OpenGL ES istemcisi gibi davranır. Bu nedenle, SurfaceFlinger bir veya iki arabelleği etkin bir şekilde üçüncü bir arabellekte birleştirirken örneğin OpenGL ES kullanır.

Çalışmanın diğer yarısını Hardware Composer HAL gerçekleştirir. Bu HAL, tüm Android grafiklerinin oluşturulması için merkezi nokta görevi görür.