Renderscript 'e giriş

Bu kılavuz, renderscript 'i tanıtır ve API düzeyi 17 veya üstünü hedefleyen bir Xamarin. Android uygulamasında iç renderscript API 'sinin nasıl kullanılacağını açıklar.

Genel Bakış

Renderscript, kapsamlı hesaplama kaynakları gerektiren Android uygulamalarının performansını artırmak amacıyla Google tarafından oluşturulan bir programlama çerçevesidir. Bu, C99tabanlı düşük düzeyde ve yüksek PERFORMANSLı bir API 'dir. CPU, GPU 'lar veya DSPs üzerinde çalışacak düşük düzey bir API olduğundan, renderscript, aşağıdakilerden herhangi birini gerçekleştirmesi gerekebilecek Android uygulamaları için uygundur:

  • Grafikler
  • Görüntü Işleme
  • Şifreleme
  • Sinyal Işleme
  • Matematik yordamları

Renderscript, clang APK 'ye paketlenmiş BIR LLVM bayt koduna betikleri kullanır ve derler. Uygulama ilk kez çalıştırıldığında, LLVM bayt kodu cihazdaki işlemcilerin makine kodu olarak derlenir. Bu mimari, bir Android uygulamasının, geliştiricilerin kendisini cihazdaki her işlemci için yazması gerekmeden makine kodunun avantajlarından yararlanmasına olanak tanır.

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 Renderscripts dosyalarını içerir.

  2. Android çerçevesi tarafından yönetilen ve Android uygulamasının renderscript çalışma zamanı ile betikleri denetlemesine ve bunlarla etkileşime geçmesini sağlayan yönetilen sarmalayıcılar . Android araç zinciri, renderscript çalışma zamanını denetlemek için Framework tarafından sunulan sınıfların yanı sıra, 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 birbirleriyle ilgisi gösterilmektedir:

Android çerçevesinin renderscript çalışma zamanı ile nasıl etkileşime gireceğini gösteren diyagram

Bir Android uygulamasında Renderscripts kullanılmasına yönelik üç önemli kavram vardır:

  1. Bağlam : kaynak, renderscript 'e kaynakları ayıran ve Android uygulamasının renderscript 'ten veri almasına ve almasına izin veren Android SDK tarafından sunulan YÖNETILEN bir API.

  2. Bir işlem çekirdeği ( kök çekirdek veya çekirdekolarak da bilinir), bu da işi yapan bir yordamdır. Çekirdek, C işlevine çok benzer; ayrılan bellekteki tüm veriler üzerinde çalıştırılacak paralelleştirilmiş bir yordamdır.

  3. Ayrılan bellek – veriler bir ayırmaaracılığıyla bir çekirdeğe veya bir çekirdeğe geçirilir. Bir çekirdeğin bir girişi ve/veya bir çıkış ayırması olabilir.

Android. Renderscripts ad alanı, renderscript çalışma zamanı ile 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önetecektir. Android uygulamasının bir veya daha fazla başlatması gerekirAndroid.Renderscripts.Allocation nesneyi. Ayırma, Android uygulaması ile renderscript çalışma zamanı arasında paylaşılan belleğe ayrılmaktan ve erişmekten 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ın tuttuğu belleğe erişimi yönetecek, Android uygulama geliştiricisinin herhangi bir ek iş yapması gerekmez.

Bir ayırma, bir veya daha fazla Android. Renderscripts. Elementsiçerir. Öğeler her bir ayırmada verileri tanımlayan özel bir türdür. Çıkış ayırmanın öğe türleri, giriş öğesi türleriyle eşleşmelidir. Yürütürken, bir renderscript, giriş ayırmasında her öğe için paralel olarak yinelenir ve sonuçları çıkış ayırmaya yazar. İki tür öğe vardır:

  • basit tür – kavramsal bu, C veri türüyle aynı veya bir char .

  • karmaşık tür : Bu tür C ile benzerdir .

Renderscript altyapısı, her bir Ayırdaki öğelerin çekirdek için gerekdiklerle uyumlu olduğundan emin olmak için bir çalışma zamanı denetimi gerçekleştirir. Ayırımdaki öğelerin veri türü, çekirdeğin beklediği veri türüyle eşleşmiyorsa, bir özel durum oluşturulur.

Tüm renderscript çekirdekleri, bir öğesinin alt öğesi olan bir tür tarafından kaydırılırAndroid.Renderscripts.Script sınıfı. ScriptSınıfı, bir renderscript için parametreleri ayarlamak, uygun olanını ayarlamak Allocations ve renderscript 'i çalıştırmak için kullanılır. Android SDK iki alt Script sınıflar vardır:

  • Android.Renderscripts.ScriptIntrinsic – Daha yaygın renderscript görevlerinin bazıları Android SDK paketlenmiştir ve Android.Renderscripts.ScriptIntrinsic sınıfının bir alt sınıfı tarafından erişilebilir. Bir geliştiriciye gerek yoktur, bu komut dosyalarını zaten sağlandığı gibi uygulamada kullanmak için ek adımlar uygulamanız gerekmez.

  • ScriptC_XXXXXScriptC_XXXXXolarak da bilinen Bunlar, geliştiriciler tarafından yazılan ve APK 'de paketlenmiş betiklerdir. Derleme zamanında Android araç zinciri, betiklerin Android uygulamasında kullanılmasına izin veren yönetilen sarmalayıcı sınıflar oluşturacaktır. Bu oluşturulan sınıfların adı, öğesinin ön eki olan renderscript dosyasının adıdır ScriptC_ . Kullanıcı betikleri yazmak ve eklemek, Xamarin. Android tarafından resmi olarak desteklenmez ve bu kılavuzun kapsamı dışındadır.

Bu iki türün yalnızca, StringIntrinsic Xamarin. Android tarafından desteklenir. Bu kılavuzda, bir Xamarin. Android uygulamasında iç betiklerin nasıl kullanılacağı ele alınmaktadır.

Gereksinimler

Bu kılavuz, API düzeyi 17 veya üstünü hedefleyen Xamarin. Android uygulamalarına yöneliktir. Kullanıcı betikleri kullanımı bu kılavuzda ele alınmıyor.

Xamarin. Android V8 destek kitaplığı , Android SDK eski sürümlerini hedefleyen uygulamalar için ınstrinsic RENDERSCRIPT API 'sinin geri noktalarını biriktirme listesine ekler. Bu paketin bir Xamarin. Android projesine eklenmesi, Android SDK eski sürümlerini hedefleyen uygulamaların iç betiklerinden yararlanmasını sağlar.

Xamarin. Android içinde Iç Renderscripts kullanma

İç betikler, en az miktarda ek kodla yoğun bilgi işlem görevleri gerçekleştirmeye yönelik harika bir yoldur. Cihazların büyük bir kesiti üzerinde en iyi performansı sunmaya yönelik olarak ayarlanmıştır. Bir iç betiğin, yönetilen koddan 10 kat daha hızlı ve özel bir C uygulamasından sonra 2-3x sürelerinden kısa bir sürede çalışması yaygın olmayan bir durumdur. Tipik işleme senaryolarının birçoğu iç betikler tarafından ele alınmıştır. Bu iç betiklerin listesi, Xamarin. Android içindeki geçerli betikleri açıklar:

İç betiklerin her biri hakkında ayrıntılı bilgi edinmek için lütfen API belgelerine başvurun.

Bir Android uygulamasında renderscript kullanmaya yönelik temel adımlar daha sonra açıklanmıştır.

Bir renderscript bağlamı oluşturmaRenderscript sınıf, renderscript bağlamı etrafında yönetilen bir sarmalayıcıdır ve başlatma, kaynak yönetimi ve temizlemeyi denetler. Renderscript nesnesi, bir RenderScript.Create Android bağlamını (örneğin, etkinlik) parametre olarak alan Factory yöntemi kullanılarak oluşturulur. Aşağıdaki kod satırı, renderscript bağlamını nasıl başlatabileceğinizi göstermektedir:

Android.Renderscripts.RenderScript renderScript = RenderScript.Create(this);

Ayırmalar oluştur : iç betiğe bağlı olarak, bir veya iki tane oluşturulması gerekebilir . VMExtensionProvisioningError hatasından dolayıAndroid.Renderscripts.Allocation sınıfında bir iç ayırmanın örneğini oluşturma konusunda yardımcı olmak için çeşitli Fabrika yöntemleri vardır. Örnek olarak, aşağıdaki kod parçacığı, bit eşlemler için ayırma oluşturmayı 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şturmanız gerekir. Aşağıdaki kod parçacığında, Allocation.CreateTyped ikincisinin orijinalile aynı türde ikinci örneğini oluşturmak için yardımcı 'nın nasıl kullanılacağı gösterilmektedir Allocation :

Android.Renderscripts.Allocation outputAllocation = Allocation.CreateTyped(renderScript, inputAllocation.Type);

Betik sarmalayıcısı örneğini oluşturma – her bir iç komut dosyası sarmalayıcı sınıfının her biri, Bu betik için bir sarmalayıcı nesne örneği oluşturmak için yardımcı yöntemlere (genellikle çağırılır) sahip olmalıdır. Aşağıdaki kod parçacığı, bir bulanıklaştırma nesnesinin nasıl örneklendirilecek bir örnektir ScriptIntrinsicBlur . Element.U8_4Yardımcı yöntemi, bir nesnenin verilerinin tutulması için uygun olan 8 bitlik, işaretsiz tamsayı değerlerinin 4 alanı olan bir veri türünü açıklayan bir öğe oluşturur Bitmap :

Android.Renderscripts.ScriptIntrinsicBlur blurScript = ScriptIntrinsicBlur.Create(renderScript, Element.U8_4(renderScript));

Ayırma ata, parametreleri ayarla, Betiği Çalıştır – sınıfı, Işlem ScriptForEach betiğini gerçekten çalıştırmak için bir yöntem sağlar. Bu yöntem, Element giriş verilerini tutan her bir üzerinde yinelenir Allocation . Bazı durumlarda, çıktıyı tutan bir sağlamak gerekebilir Allocation . ForEach , çıkış ayırma içeriğinin üzerine yazar. Önceki adımlardan kod parçacıkları ile devam etmek için, bu örnekte bir giriş ayırmayı atama, bir parametre ayarlama ve son olarak komut dosyasını çalıştırma (sonuçları çıkış ayırmaya kopyalama) gösterilmektedir:

blurScript.SetInput(inputAllocation);
blurScript.SetRadius(25);  // Set a pamaeter
blurScript.ForEach(outputAllocation);

Renderscript tarifimiyle bir görüntüyü bulanıklaştırmak isteyebilirsiniz, bu, Xamarin. Android içinde iç betiğin nasıl kullanılacağına ilişkin bir örnektir.

Özet

Bu kılavuz renderscript ' i ve bir Xamarin. Android uygulamasında nasıl kullanılacağını sunmuştur. Bu, renderscript 'in ne olduğunu ve Android uygulamasında nasıl çalıştığını kısaca ele alınmaktadır. Renderscript 'teki bazı anahtar bileşenlerden ve Kullanıcı betikleri ile ınstrinsic betikleriarasındaki farka göre açıklanacaktır. Son olarak, bu kılavuz bir Xamarin. Android uygulamasında iç komut dosyası kullanma adımlarını ele alınmaktadır.