Renderscript'e Giriş
Bu kılavuzda Renderscript tanıtılmaktadır ve API düzeyi 17 veya üzerini hedefleyen bir Xamarin.Android uygulamasında iç Renderscript API'lerinin nasıl kullanılacağı açıklanmaktadır.
Genel bakış
Renderscript, Kapsamlı hesaplama kaynakları gerektiren Android uygulamalarının performansını geliştirmek amacıyla Google tarafından oluşturulan bir programlama çerçevesidir. C99 tabanlı düşük düzeyli, yüksek performanslı bir API'dir. CPU'lar, GPU'lar veya DSP'ler üzerinde çalışacak düşük düzeyli bir API olduğundan, Renderscript aşağıdakilerden herhangi birini gerçekleştirmesi gerekebilecek Android uygulamaları için uygundur:
- Grafik
- Görüntü İşleme
- Şifreleme
- Sinyal İşleme
- Matematiksel Yordamlar
Renderscript betikleri kullanır clang
ve APK'ye paketlenmiş LLVM bayt koduna derler. Uygulama ilk kez çalıştırıldığında, LLVM bayt kodu cihazdaki işlemciler için makine kodunda derlenir. Bu mimari, bir Android uygulamasının, geliştiricilerin cihazdaki her işlemci için yazmak zorunda kalmadan makine kodunun avantajlarından yararlanmasını sağlar.
Bir Renderscript yordamının iki bileşeni vardır:
Renderscript çalışma zamanı – Bu, Renderscript'in yürütülmesinden sorumlu olan yerel API'lerdir. Bu, uygulama için yazılmış tüm Renderscript'leri içerir.
Android Framework'ten Yönetilen Sarmalayıcılar – Bir Android uygulamasının Renderscript çalışma zamanını ve betiklerini denetlemesine ve bunlarla etkileşim kurmasına olanak sağlayan yönetilen sınıflar. Android araç zinciri, Renderscript çalışma zamanını denetlemek için sağlanan çerçeve sınıflarına ek olarak Renderscript kaynak kodunu inceler ve Android uygulaması tarafından kullanılmak üzere yönetilen sarmalayıcı sınıfları oluşturur.
Aşağıdaki diyagramda bu bileşenlerin arasındaki ilişki gösterilmektedir:
Bir Android uygulamasında Renderscript'leri kullanmak için üç önemli kavram vardır:
Bağlam : Android SDK tarafından sağlanan ve Kaynakları Renderscript'e ayıran ve Android uygulamasının Renderscript'ten veri geçirmesine ve almasına izin veren yönetilen API.
İşlem çekirdeği – Kök çekirdek veya çekirdek olarak da bilinir, bu işlemi yerine getiren bir yordamdır. Çekirdek bir C işlevine çok benzer; ayrılmış bellekteki tüm veriler üzerinde çalıştırılacak paralelleştirilebilir bir yordamdır.
Ayrılmış Bellek – Veriler bir ayırma aracılığıyla bir çekirdekten ve çekirdekten geçirilir. Çekirdekte bir giriş ve/veya bir çıkış Ayırması olabilir.
Android.Renderscripts ad alanı, Renderscript çalışma zamanıyla etkileşime yönelik sınıfları içerir. Özellikle sınıfı, Renderscript
Renderscript altyapısının yaşam döngüsünü ve kaynaklarını yönetir. Android uygulamasının bir veya daha fazla başlatması gerekir Android.Renderscripts.Allocation
Nesne. Ayırma, Android uygulaması ile Renderscript çalışma zamanı arasında paylaşılan belleğe ayırma ve bunlara erişmeden sorumlu yönetilen bir API'dir. Genellikle giriş için bir Ayırma oluşturulur ve isteğe bağlı olarak çekirdeğin çıkışını tutmak için başka bir Ayırma oluşturulur. Renderscript çalışma zamanı altyapısı ve ilişkili yönetilen sarmalayıcı sınıfları Ayırmalar tarafından tutulan belleğe erişimi yönetecektir. Bir Android uygulama geliştiricisinin ek iş yapması gerekmez.
Ayırma bir veya daha fazla Android.Renderscripts.Elements içerir. Öğeler, her Ayırmadaki verileri açıklayan özel bir tür. Çıkış Ayırma'nın Öğe türleri giriş Öğesinin türleriyle eşleşmelidir. Yürütülürken, bir Renderscript giriş Ayırması'ndaki her Öğeyi paralel olarak yineler ve sonuçları çıkış Ayırmasına yazar. İki tür Öğe vardır:
simple type – Kavramsal olarak bu,
float
C veri türü veya ile aynıdırchar
.karmaşık tür – Bu tür C'ye
struct
benzer.
Renderscript altyapısı, her Ayırmadaki Öğelerin çekirdeğin gerektirdiği öğelerle uyumlu olduğundan emin olmak için bir çalışma zamanı denetimi gerçekleştirir. Ayırmadaki Öğelerin veri türü çekirdeğin beklediği veri türüyle eşleşmiyorsa, bir özel durum oluşturulur.
Tüm Renderscript çekirdekleri, Android.Renderscripts.Script
Sınıfı. Script
sınıfı bir Renderscript için parametreleri ayarlamak, uygun Allocations
öğesini ayarlamak ve Renderscript'i çalıştırmak için kullanılır. Android SDK'sında iki Script
alt sınıf vardır:
Android.Renderscripts.ScriptIntrinsic
– Daha yaygın renderscript görevlerinden bazıları Android SDK'sında paketlenmiştir ve ScriptIntrinsic sınıfının bir alt sınıfı tarafından erişilebilir. Bir geliştiricinin, bu betikleri zaten sağlandığı için kendi uygulamasında kullanmak için ek adımlar gerçekleştirmesine gerek yoktur.ScriptC_XXXXX
– Kullanıcı betikleri olarak da bilinir, bunlar geliştiriciler tarafından yazılan ve APK'da paketlenen betiklerdir. Derleme zamanında Android araç zinciri, betiklerin Android uygulamasında kullanılmasına izin veren yönetilen sarmalayıcı sınıfları oluşturur. Oluşturulan bu sınıfların adı, ön ekli Renderscript dosyasınınScriptC_
adıdır. Kullanıcı betikleri yazma ve birleştirme, Xamarin.Android tarafından ve bu kılavuzun kapsamı dışında resmi olarak desteklenmez.
Bu iki türden yalnızca Xamarin.Android StringIntrinsic
tarafından desteklenir. Bu kılavuzda Xamarin.Android uygulamasında iç betiklerin nasıl kullanılacağı açıklanır.
Gereksinimler
Bu kılavuz, API düzeyi 17 veya üzerini hedefleyen Xamarin.Android uygulamalarına yöneliktir. Kullanıcı betiklerinin kullanımı bu kılavuzda ele alınmamıştır.
Xamarin.Android V8 Destek Kitaplığı, Android SDK'nın eski sürümlerini hedefleyen uygulamalar için instrinsic Renderscript API'lerini geri gönderir. Bu paketi bir Xamarin.Android projesine eklemek, Android SDK'nın eski sürümlerini hedefleyen uygulamaların iç betiklerden yararlanmasına izin vermelidir.
Xamarin.Android'de İç renderscript'leri kullanma
İç betikler, yoğun bilgi işlem görevlerini en az miktarda ek kodla gerçekleştirmenin harika bir yoludur. Cihazların büyük bir çapraz bölümünde en iyi performansı sunmak için el ile ayarlanmıştır. Bir iç betiğin yönetilen koddan 10 kat daha hızlı ve özel bir C uygulamasından 2-3 kat daha hızlı çalışması sık karşılaşılan bir durum değildir. Tipik işleme senaryolarının çoğu iç betikler tarafından ele alınmıştır. Bu iç betikler listesi, Xamarin.Android'deki geçerli betikleri açıklar:
ScriptIntrinsic3DLUT – 3B arama tablosu kullanarak RGB'yi RGBA'ya dönüştürür.
ScriptIntrinsicBLAS – BLAS için performans Renderscript API'lerini sağlayın. BLAS (Temel Doğrusal Cebir AltProgramları) temel vektör ve matris işlemlerini gerçekleştirmek için standart yapı taşları sağlayan rutinlerdir.
ScriptIntrinsicBlend : İki Ayırmayı bir araya getiren.
ScriptIntrinsicBlur : Ayırmaya Gauss bulanıklaştırması uygular.
ScriptIntrinsicColorMatrix – Ayırmaya bir renk matrisi uygular (yani renkleri değiştirin, tonu ayarlayın).
ScriptIntrinsicConvolve3x3 – Ayırmaya 3x3 renk matrisi uygular.
ScriptIntrinsicConvolve5x5 – Ayırmaya 5x5 renk matrisi uygular.
ScriptIntrinsicHistogram – İç histogram filtresi.
ScriptIntrinsicLUT : Arabelleğe kanal başına arama tablosu uygular.
ScriptIntrinsicResize – 2B ayırmanın yeniden boyutlandırılması için betik.
ScriptIntrinsicYuvToRGB – BIR YUV arabelleği RGB'ye dönüştürür.
İç betiklerin her biri hakkında ayrıntılı bilgi için lütfen API belgelerine bakın.
Bir Android uygulamasında Renderscript'i kullanmaya yönelik temel adımlar bundan sonra açıklanmıştır.
Renderscript Bağlamı Oluşturma – Renderscript
sınıfı, Renderscript bağlamı etrafında yönetilen bir sarmalayıcıdır ve başlatmayı, kaynak yönetimini ve temizlemeyi denetler. Renderscript nesnesi, parametre olarak bir Android Bağlamı RenderScript.Create
(etkinlik gibi) alan fabrika yöntemi kullanılarak oluşturulur. Aşağıdaki kod satırı, Renderscript bağlamının nasıl başlatılmış olduğunu gösterir:
Android.Renderscripts.RenderScript renderScript = RenderScript.Create(this);
Ayırma Oluşturma – İç betiğine bağlı olarak, bir veya iki Allocation
sn oluşturmak gerekebilir. Android.Renderscripts.Allocation
sınıfı, bir iç için ayırma örneği oluşturmada yardımcı olacak çeşitli fabrika yöntemlerine sahiptir. Örnek olarak, aşağıdaki kod parçacığı Bit Eşlemler için Ayırma'nın nasıl oluşturulacağını gösterir.
Android.Graphics.Bitmap originalBitmap;
Android.Renderscripts.Allocation inputAllocation = Allocation.CreateFromBitmap(renderScript,
originalBitmap,
Allocation.MipmapControl.MipmapFull,
AllocationUsage.Script);
Genellikle, bir Allocation
betiğin çıkış verilerini tutmak için bir oluşturmak gerekir. Aşağıdaki kod parçacığında, özgün kod parçacığıyla Allocation.CreateTyped
aynı türde bir saniye Allocation
örneği oluşturmak için yardımcının nasıl kullanılacağı gösterilmektedir:
Android.Renderscripts.Allocation outputAllocation = Allocation.CreateTyped(renderScript, inputAllocation.Type);
Betik sarmalayıcı örneği oluşturma – İç betik sarmalayıcı sınıflarının her birinde, bu betik için sarmalayıcı nesnesinin örneğini oluşturmak için yardımcı yöntemler (genellikle denir Create
) olmalıdır. Aşağıdaki kod parçacığı, bulanıklaştırma nesnesinin örneğini ScriptIntrinsicBlur
oluşturma örneğidir. Element.U8_4
yardımcı yöntemi, bir nesnenin verilerini tutmak için uygun, 8 bit, işaretsiz tamsayı değerlerinin 4 alanı olan bir veri türünü açıklayan bir Bitmap
Öğe oluşturur:
Android.Renderscripts.ScriptIntrinsicBlur blurScript = ScriptIntrinsicBlur.Create(renderScript, Element.U8_4(renderScript));
Ayırmaları Ata, Parametreleri Ayarla ve Betiği Çalıştır – Script
sınıfı, Renderscript'i gerçekten çalıştırmak için bir ForEach
yöntem sağlar. Bu yöntem, giriş verilerini tutan içindeki Allocation
her Element
biri üzerinde yinelenir. Bazı durumlarda, çıkışı tutan bir Allocation
sağlamak gerekebilir.
ForEach
çıkış Ayırma içeriğinin üzerine yazar. Önceki adımlardaki kod parçacıklarıyla devam etmek için, bu örnekte giriş Ayırma atama, parametre ayarlama ve son olarak betiği çalıştırma (sonuçları çıkış Ayırmaya kopyalama) gösterilmektedir:
blurScript.SetInput(inputAllocation);
blurScript.SetRadius(25); // Set a pamaeter
blurScript.ForEach(outputAllocation);
Renderscript ile Görüntü Bulanıklaştırma tarifine göz atabilirsiniz. Bu, Xamarin.Android'de iç betiğin nasıl kullanılacağına ilişkin eksiksiz bir örnektir.
Özet
Bu kılavuzda Renderscript ve Xamarin.Android uygulamasında nasıl kullanılacağı tanıtılmıştır. Renderscript'in ne olduğu ve bir Android uygulamasında nasıl çalıştığı kısaca açıklandı. Renderscript'teki bazı temel bileşenler ve kullanıcı betikleri ile instrinsic betikler arasındaki fark açıklanmıştır. Son olarak, bu kılavuzda Xamarin.Android uygulamasında iç betik kullanma adımları açıklanmaktadır.