GPU bilişiminin ideal olduğu iş yükleri için RenderScript komut dosyalarını OpenGL ES (GLES), Kotlin veya Java dilinde yazılmış ya da NDK kullanan uygulamalara izin verir GPU donanımından faydalanmaları gerekecek. Aşağıdaki üst düzey genel bakış, aşağıdaki amaçlarla OpenGL ES 3.1 işlem gölgelendiricilerini kullanmanıza yardımcı olur: RenderScript komut dosyalarını değiştirin.
GLES Başlatma
RenderScript bağlam nesnesi oluşturmak yerine aşağıdaki adımları uygulayın: kullanarak GLES ekran dışı bağlamı oluşturun:
Varsayılan ekranı al
Varsayılan ekranı kullanarak GLES sürümünü belirterek EGL'yi başlatın.
Şu yüzey türüne sahip bir EGL yapılandırması seçin:
EGL_PBUFFER_BIT
.EGL bağlamı oluşturmak için ekranı ve yapılandırmayı kullanın.
Ekran dışı yüzey oluşturmak için
eglCreatePBufferSurface
. Bağlam yalnızca bilgi işlem için kullanılacak. Çok küçük (1x1) teşekkür ederiz.Oluşturma ileti dizisini ve çağrıyı oluşturma
eglMakeCurrent
; görüntü, yüzey, ve EGL bağlamını kullanır.
Örnek uygulama,
GLSLImageProcessor.kt
.
Daha fazla bilgi edinmek için bkz.
EGLSurfaces ve OpenGL ES.
GLES hata ayıklama çıkışı
OpenGL'den yararlı hatalar alma, hata ayıklama kaydını etkinleştirmek için bir uzantı kullanır
hata ayıklama çıktısı geri çağırması yapar. Bu işlemi SDK'dan yapma yöntemi,
glDebugMessageCallbackKHR
, hiç uygulanmamıştır ve
istisna. Örnek uygulama
NDK kodundan geri çağırma için bir sarmalayıcı içerir.
GLES Ayırmaları
Bir RenderScript ayırması, bir Sabit depolama dokusu veya Gölge Depolama Arabellek Nesnesi. Salt okunur resimlerde Sampler Object kullanabilir ve böylece filtre uygulayabilirsiniz.
GLES kaynakları, GLES içinde ayrılır. Bellek kopyalamayı önlemek için
diğer Android bileşenleriyle etkileşimde bulunurken bize
KHR Görseller için paylaşıma izin veren uzantı
2D dizi örneğidir. Bu uzantı Android cihazlar için gerekliydi
Android 8.0 ile başlar. İlgili içeriği oluşturmak için kullanılan
grafik-çekirdek
Android Jetpack kitaplığı
bu resimlerin yönetilen kod ve eşleme içinde oluşturulması için destek içerir
bunları ayrı bir HardwareBuffer
'e aktarmak için:
val outputBuffers = Array(numberOfOutputImages) {
HardwareBuffer.create(
width, height, HardwareBuffer.RGBA_8888, 1,
HardwareBuffer.USAGE_GPU_SAMPLED_IMAGE
)
}
val outputEGLImages = Array(numberOfOutputImages) { i ->
androidx.opengl.EGLExt.eglCreateImageFromHardwareBuffer(
display,
outputBuffers[i]
)!!
}
Ne yazık ki, bu yöntem, tüm dokümanlar için gereken sabit depolama
doğrudan arabelleğe yazmak için bir bilgi işlem gölgelendiricisi. Örnekte kullanılanlar:
Kullanılan depolama alanı dokusunu kopyalamak için glCopyTexSubImage2D
bunu KHR Image
içinde görebilirsiniz. OpenGL sürücüsü
EGL Image Storage uzantısı,
, kopyalamayı önlemek için paylaşılan sabit bir depolama dokusu oluşturmak amacıyla kullanılabilir.
GLSL işlem gölgelendiricilerine dönüştürme
RenderScript komut dosyalarınız, GLSL bilgi işlem gölgelendiricilerine dönüştürülür.
GLSL bilgi işlem gölgelendiricisi yazma
OpenGL ES'de,işlem gölgelendiricileri OpenGL Gölgelendirme Dili (GLSL) olarak değiştirin.
Küresel komut dosyalarının uyarlanması
Alfabedeki karakter özelliklerine göre, istediğiniz her tür üniformayı kullanabilirsiniz. veya gölgelendirici içinde değiştirilmeyen genel öğeler için tek tip arabellek nesneleri:
- Tek tip arabellek: sabit sınır itme.
Gölgelendirici içinde değiştirilen genel öğeler için Sabit depolama dokusu veya Gölge Depolama Arabellek Nesnesi.
Hesaplamaları Yürütme
Compute gölgelendiriciler, grafik ardışık düzeninin bir parçası değildir. genel amaçlıdır ve paralelliği son derece yüksek işleri hesaplamak için tasarlanmıştır. Bu sayede nasıl yürüttükleri üzerinde daha fazla kontrol sahibi olmakla birlikte, nasıl paralel hale getirildiğini biraz daha iyi anlarsınız.
Compute programını oluşturma ve başlatma
Compute programının oluşturulması ve başlatılmasının bir GLES gölgelendiriciyle çalışır.
Programı ve programla ilişkili Compute gölgelendiriciyi oluşturun.
Gölgelendirici kaynağını ekleyin, gölgelendiriciyi derleyin (ve sonuçları kontrol edin) bakın).
Gölgelendiriciyi ekleyin, programı bağlayın ve programı kullanın.
İstediğiniz üniformaları oluşturun, başlatın ve bağlayın.
Hesaplama başlatma
Compute gölgelendiriciler, bir serideki soyut 1D, 2D veya 3D alanda çalışır ve tüm çalışma gruplarını temsil eder. Bunlar, gölgelendirici kaynak kodunda tanımlanır ve gölgelendiricinin geometrisine ve minimum çağrı boyutuna göre değişiklik gösterir. Aşağıdaki gölgelendirici 2D görüntü üzerinde çalışır ve çalışma gruplarını iki boyutlar:
private const val WORKGROUP_SIZE_X = 8
private const val WORKGROUP_SIZE_Y = 8
private const val ROTATION_MATRIX_SHADER =
"""#version 310 es
layout (local_size_x = $WORKGROUP_SIZE_X, local_size_y = $WORKGROUP_SIZE_Y, local_size_z = 1) in;
Çalışma grupları, GL_MAX_COMPUTE_SHARED_MEMORY_SIZE
tarafından tanımlanan anıları paylaşabilir,
ve veri analizi için en az 32 KB dosya boyutumemoryBarrierShared()
tutarlı belleğe erişimi sağlar.
Çalışma grubu boyutunu tanımlayın
Sorun alanınız 1’lik çalışma grubu boyutlarıyla iyi çalışsa bile, uygun çalışma grubu boyutunun, Compute gölgelendiriciyi paralel hale getirmek açısından önemlidir. Boyut çok küçükse GPU sürücüsü hesaplamanızı paralel yapmayabilir yeter. İdeal olarak bu boyutlar GPU başına ayarlanmalıdır, ancak makul varsayılan ayarlar, çalışma grubu gibi mevcut cihazlarda yeterince iyi çalışıyor. 8x8 boyutunu belirtir.
GL_MAX_COMPUTE_WORK_GROUP_COUNT
var, ancak çok önemli; olmalı
üç eksende de en az 65.535 olmalıdır.
Gölgelendiriciyi gönder
Hesaplamaları yürütmenin son adımı,
ve şu gibi dağıtma işlevlerinin
glDispatchCompute
. Görevlendirme işlevi
çalışma grubu sayısını ayarlamak için aşağıdaki adımları uygulayın:
GLES31.glDispatchCompute(
roundUp(inputImage.width, WORKGROUP_SIZE_X),
roundUp(inputImage.height, WORKGROUP_SIZE_Y),
1 // Z workgroup size. 1 == only one z level, which indicates a 2D kernel
)
Değeri döndürmek için önce bellek bariyeri:
GLES31.glMemoryBarrier(GLES31.GL_SHADER_IMAGE_ACCESS_BARRIER_BIT)
Birden fazla çekirdeği birbirine bağlamak için:
(örneğin, ScriptGroup
kullanarak kodu taşımak için), yeni bir kod oluşturun ve
ve çıkışa erişimlerini bellekle senkronize ederek birden çok program oluşturabilirsiniz.
engeller.
Örnek uygulama , iki hesaplama görevini gösterir:
- HUE rotasyonu: Tek bir Compute gölgelendirici olan işlem görevi. Görüntüleyin
Kod örneği için
GLSLImageProcessor::rotateHue
. - Bulanıklaştırma: Sırayla iki hesaplama yapan daha karmaşık bir işlem görevi
gölgelendiriciler. Kod örneği için bkz.
GLSLImageProcessor::blur
.
Bellek bariyerleri hakkında daha fazla bilgi edinmek için Görünürlüğü sağlama yanı sıra Paylaşılan değişkenler ,