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:

  1. 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.

  2. 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:

Diagram illustrating how the Android Framework interacts with the Renderscript Runtime

Bir Android uygulamasında Renderscript'leri kullanmak için üç önemli kavram vardır:

  1. 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.

  2. İş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.

  3. 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ır char.

  • karmaşık tür – Bu tür C'ye structbenzer.

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ın ScriptC_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:

İç 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 Allocationsn 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.