Úvod do Renderscriptu
Tato příručka představuje Renderscript a vysvětluje, jak používat vnitřní rozhraní Renderscript API v aplikaci Xamarin.Android, která cílí na rozhraní API úrovně 17 nebo vyšší.
Přehled
Renderscript je programovací rozhraní, které vytvořil Google za účelem zlepšení výkonu aplikací pro Android, které vyžadují rozsáhlé výpočetní prostředky. Jedná se o rozhraní API nízké úrovně s vysokým výkonem založené na C99. Vzhledem k tomu, že se jedná o rozhraní API nízké úrovně, které bude běžet na procesorech, GPU nebo DSP, renderscript je vhodný pro aplikace pro Android, které mohou potřebovat provádět některé z následujících akcí:
- Grafika
- Zpracování obrázků
- Šifrování
- Zpracování signálů
- Matematické rutiny
Renderscript použije a clang zkompiluje skripty do byte kódu LLVM, který je součástí souboru APK. Při prvním spuštění aplikace se kód byte LLVM zkompiluje do strojového kódu pro procesory v zařízení. Tato architektura umožňuje aplikaci pro Android využívat výhody strojového kódu, aniž by ji vývojáři museli psát pro každý procesor na samotném zařízení.
Rutina Renderscript má dvě komponenty:
Modul runtime Renderscript – nativní rozhraní API, která zodpovídají za spuštění Renderscriptu. To zahrnuje všechny renderscripty napsané pro aplikaci.
Spravované obálky z Android Frameworku – spravované třídy, které umožňují aplikaci pro Android řídit modul runtime a skripty Renderscriptu a pracovat s nimi. Kromě tříd poskytovaných rozhraním pro řízení modulu runtime Renderscript prozkoumá nástroj pro Android zdrojový kód Renderscriptu a vygeneruje spravované třídy obálky, které bude používat aplikace pro Android.
Následující diagram znázorňuje, jak tyto komponenty souvisejí:

Existují tři důležité koncepty používání renderscriptů v aplikaci pro Android:
Kontext – spravované rozhraní API poskytované službou Android SDK, které přiděluje prostředky Renderscriptu a umožňuje aplikaci pro Android předávat a přijímat data z Renderscriptu.
Výpočetní jádro – tato rutina, která tuto práci dělá,se označuje také jako kořenové jádro nebo jádro. Jádro se velmi podobá funkci jazyka C. Je to paralelizovatelná rutina, která se spustí přes všechna data v přidělené paměti .
Přidělená paměť – Data se předá do a z jádra prostřednictvím přidělení. Jádro může mít jeden vstup nebo jedno přidělení výstupu.
Obor názvů Android.Renderscripts obsahuje třídy pro interakci s modul runtime Renderscript. Konkrétně bude třída Renderscript spravovat životní cyklus a prostředky modulu Renderscript. Aplikace pro Android musí inicializovat jeden nebo víceAndroid.Renderscripts.Allocation Objekty. Přidělení je spravované rozhraní API, které zodpovídá za přidělení a přístup k paměti sdílené mezi aplikací pro Android a modul runtime Renderscript. Obvykle se pro vstup vytvoří jedno přidělení a volitelně se vytvoří další Přidělení, které bude obsahovat výstup jádra. Modul runtime Renderscriptu a přidružené spravované obálkové třídy budou spravovat přístup k paměti přidělené službou a vývojář aplikace pro Android nemusí dělat žádnou další práci.
Přidělení bude obsahovat jeden nebo více souborů Android.Renderscripts.Elements. Prvky jsou specializovaný typ, který popisuje data v každém přidělení. Typy elementů výstupního přidělení musí odpovídat typům vstupního elementu. Při provádění bude Renderscript iterovat přes každý prvek ve vstupním přidělení paralelně a zapíše výsledky do výstupního přidělení. Existují dva typy elementů:
simple type – koncepčně je to stejné jako datový typ jazyka C nebo
char.komplexní typ – tento typ se podobá objektu C .
Modul Renderscript provede kontrolu modulu runtime, aby zajistil, že elementy v každém přidělení jsou kompatibilní s tím, co vyžaduje jádro. Pokud datový typ elementů v přidělení neodpovídá datovému typu, který očekává jádro, vyvolá se výjimka.
Všechna jádra Renderscriptu budou zabalena typem, který je potomkem třídy .Android.Renderscripts.Script Třída. Třída Script se používá k nastavení parametrů pro Renderscript, nastavení odpovídající třídy a spuštění Allocations Renderscriptu. V souboru Script jsou dvě podtřídy Android SDK:
Android.Renderscripts.ScriptIntrinsic– Některé z nejběžnějších úloh Renderscriptu jsou součástí Android SDK a jsou přístupné podtřídou třídyAndroid.Renderscripts.ScriptIntrinsicVývojáři nemusí při používání těchto skriptů ve své aplikaci podnikovat žádné další kroky, protože už jsou k dispozici.ScriptC_XXXXX– Označované také jakoScriptC_XXXXX, jedná se o skripty, které jsou napsané vývojáři a zabalené v souboru APK. V době kompilace vygeneruje nástroj pro Android třídy spravovaných obálk, které umožní použití skriptů v aplikaci pro Android. Název těchto vygenerovaných tříd je název souboru Renderscriptu s předponouScriptC_. Xamarin.Android oficiálně nepodporuje psaní a začlenění uživatelských skriptů a přesahuje rozsah této příručky.
Z těchto dvou typů podporuje StringIntrinsic Xamarin.Android pouze . Tato příručka popisuje, jak používat vnitřní skripty v aplikaci Xamarin.Android.
Požadavky
Tento průvodce je pro aplikace Xamarin.Android, které cílí na úroveň rozhraní API 17 nebo vyšší. Použití uživatelských skriptů není v této příručce zahrnuté.
Knihovna podpory Xamarin.Android v8 podporuje instrinsické rozhraní Renderscript API pro aplikace, které cílí na starší verze Android SDK. Přidání tohoto balíčku do projektu Xamarin.Android by mělo aplikacím, které cílí na starší verze Android SDK využívat vnitřní skripty.
Použití vnitřních renderscriptů v Xamarin.Androidu
Vnitřní skripty jsou skvělým způsobem, jak provádět náročné výpočetní úlohy s minimálním množstvím dalšího kódu. Byly ručně vyladěny tak, aby na velké části zařízení nabízí optimální výkon. Není neobvyklé, že vnitřní skript běží 10krát rychleji než spravovaný kód a 2–3krát po než vlastní implementaci jazyka C. Řadu typických scénářů zpracování pokryje vnitřní skripty. Tento seznam vnitřních skriptů popisuje aktuální skripty v Xamarin.Android:
ScriptIntrinsic3DLUT – převede RGB na RGBA pomocí 3D vyhledávací tabulky.
ScriptIntrinsicBLAS – poskytujevysoce výkonná rozhraní RENDERSCRIPT API pro BLAS. Subprogramy BLAS (Basic Linear Algebra Subprograms) jsou rutiny, které poskytují standardní stavební bloky pro provádění základních vektorových a maticových operací.
ScriptIntrinsicBlend – směšuje dvě přidělení dohromady.
ScriptIntrinsicB pro přidělení použije Gaussova rozostření.
ScriptIntrinsicColorMatrix – použije matici barev na přidělení (tj. změnit barvu, upravit hue).
ScriptIntrinsicConvolve3x3 – použije pro přidělení barevnou matici 3x3.
ScriptIntrinsicConvolve5x5 – použije matici barev 5x5 pro přidělení.
ScriptIntrinsicHistogram – vnitřní filtr histogramu.
ScriptIntrinsicLUT – použije vyhledávací tabulku pro každý kanál do vyrovnávací paměti.
ScriptIntrinsicResize – skript pro změnu velikosti 2D přidělení.
ScriptIntrinsicYuvToRGB – převede vyrovnávací paměť YUV na RGB.
Podrobnosti o jednotlivých vnitřních skriptech najdete v dokumentaci k rozhraní API.
Základní kroky pro použití Renderscriptu v aplikaci pro Android jsou popsány dále.
Vytvoření kontextu renderscriptu –Renderscript třída je spravovaná obálka kolem kontextu Renderscriptu a řídí inicializaci, správu prostředků a čištění. Objekt Renderscript se vytvoří pomocí metody factory, která jako parametr přebírá kontext RenderScript.Create Androidu (například aktivitu). Následující řádek kódu ukazuje, jak inicializovat kontext Renderscriptu:
Android.Renderscripts.RenderScript renderScript = RenderScript.Create(this);
Vytvoření přidělení – v závislosti na vnitřním skriptu může být nutné vytvořit jednu nebo dvě s. ProstředekAndroid.Renderscripts.Allocation Třída má několik metod pro vytváření, které pomáhají s vytvořením instance přidělení pro vnitřní objekt. Následující fragment kódu například ukazuje, jak vytvořit přidělení pro rastrové obrázky.
Android.Graphics.Bitmap originalBitmap;
Android.Renderscripts.Allocation inputAllocation = Allocation.CreateFromBitmap(renderScript,
originalBitmap,
Allocation.MipmapControl.MipmapFull,
AllocationUsage.Script);
Často bude nutné vytvořit objekt , Allocation který bude obsahovat výstupní data skriptu. Následující fragment kódu ukazuje, jak pomocí pomocné instance vytvořit instanci sekundy, která je stejného Allocation.CreateTypedAllocation typu jako původní:
Android.Renderscripts.Allocation outputAllocation = Allocation.CreateTyped(renderScript, inputAllocation.Type);
Vytvoření instance obálky skriptu – každá z tříd obálky vnitřního skriptu by měla mít pomocné metody (obvykle nazývané ) pro vytvoření instance obálkového objektu pro tento skript. Následující fragment kódu je příkladem vytvoření instance objektu ScriptIntrinsicBlur rozostření. Pomocná metoda vytvoří element , který popisuje datový typ, který představuje 4 pole Element.U8_4 8bitových, unsigned integer hodnot vhodných pro držení dat Bitmap objektu:
Android.Renderscripts.ScriptIntrinsicBlur blurScript = ScriptIntrinsicBlur.Create(renderScript, Element.U8_4(renderScript));
Přiřazení přidělení, nastavení parametrů, Spustit skript – Script třída poskytuje ForEach metodu pro vlastní spuštění Renderscriptu. Tato metoda bude iterovat po jednotlivých Element objektech ve Allocation vstupních datech. V některých případech může být nutné zadat objekt , Allocation který obsahuje výstup.
ForEach přepíše obsah výstupního přidělení. Pokud chcete pokračovat fragmenty kódu z předchozích kroků, tento příklad ukazuje, jak přiřadit vstupní přidělení, nastavit parametr a nakonec spustit skript (zkopírování výsledků do výstupního přidělení):
blurScript.SetInput(inputAllocation);
blurScript.SetRadius(25); // Set a pamaeter
blurScript.ForEach(outputAllocation);
Možná si budete chtít prohlédněte rozostření obrázku s receptem Renderscriptu. Je to kompletní příklad použití vnitřního skriptu v Xamarin.Androidu.
Souhrn
Tato příručka představila Renderscript a způsob jeho použití v aplikaci Xamarin.Android. Stručně probrali, co je Renderscript a jak funguje v aplikaci pro Android. Popsal některé klíčové komponenty v Renderscriptu a rozdíl mezi uživatelskými skripty a skripty instrinsic. Nakonec tento průvodce probíral kroky při používání vnitřního skriptu v aplikaci Xamarin.Android.