Úvod do renderscriptu
Tato příručka představuje renderscript a vysvětluje, jak používat vnitřní rozhraní API renderscriptu v aplikaci Xamarin.Android, která cílí na úroveň rozhraní API 17 nebo vyšší.
Přehled
Renderscript je programovací architektura vytvořená Společností Google pro účely zlepšení výkonu aplikací pro Android, které vyžadují rozsáhlé výpočetní prostředky. Jedná se o nízkoúrovňové a vysoce výkonné rozhraní API založené na C99. Vzhledem k tomu, že se jedná o rozhraní API nízké úrovně, které se bude spouštět na procesorech, GPU nebo DSPs, je renderscript vhodný pro aplikace pro Android, které můžou potřebovat provést některou z těchto věcí:
- Grafika
- Zpracování obrázku
- Šifrování
- Zpracování signálu
- Matematické rutiny
Renderscript použije clang
a zkompiluje skripty do bajtového kódu LLVM, který je součástí APK. Při prvním spuštění aplikace se kód bajtů LLVM zkompiluje do kódu počítače 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 vlastním zařízení.
Rutina Renderscriptu má dvě komponenty:
Modul runtime RenderScript – Jedná se o nativní rozhraní API, která jsou zodpovědná za provádění renderscriptu. To zahrnuje všechny renderscripty napsané pro aplikaci.
Spravované obálky z rozhraní Android Framework – spravované třídy, které aplikaci pro Android umožňují řídit a pracovat s modulem runtime a skripty RenderScriptu. Kromě tříd poskytovaných architekturou pro řízení modulu runtime RenderScript zkontroluje sada nástrojů Android zdrojový kód Renderscriptu a vygeneruje třídy spravovaných obálky pro použití aplikací pro Android.
Následující diagram znázorňuje, jak tyto komponenty souvisejí:
Pro použití renderscriptů v aplikaci pro Android existují tři důležité koncepty:
Kontext – spravované rozhraní API poskytované sadou 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 – označuje se také jako kořenové jádro nebo jádro, což je rutina, která funguje. Jádro je velmi podobné funkci jazyka C; je to paralelizovatelná rutina, která bude spuštěna přes všechna data v přidělené paměti .
Přidělená paměť – Data se předávají do a z jádra prostřednictvím přidělení. Jádro může mít jeden vstup nebo jeden výstupní přidělení.
Obor názvů Android.Renderscripts obsahuje třídy pro interakci s modulem runtime Renderscript. Konkrétně Renderscript
třída bude spravovat životní cyklus a prostředky modulu Renderscript. Aplikace pro Android musí inicializovat jednu nebo více Android.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 modulem runtime RenderScript. Obvykle se pro vstup vytvoří jedna alokace a volitelně se vytvoří další přidělení pro uložení výstupu jádra. Modul modulu runtime Renderscript a přidružené spravované třídy obálky budou spravovat přístup k paměti uchovávané přidělením, není nutné, aby vývojář aplikace pro Android udělal další práci.
Přidělení bude obsahovat jeden nebo více android.Renderscripts.Elements. Prvky jsou specializovaný typ, který popisuje data v jednotlivých přiděleních. Typy elementů výstupního přidělení musí odpovídat typům vstupního elementu. Při provádění bude renderscript iterovat každý prvek ve vstupní přidělení paralelně a zapsat výsledky do výstupní přidělení. Existují dva typy elementů:
jednoduchý typ – koncepčně je to stejné jako datový typ
float
jazyka C nebo .char
komplexní typ - Tento typ je podobný C
struct
.
Modul RenderScript provede kontrolu za běhu, aby bylo zajištěno, že prvky v každém přidělení jsou kompatibilní s tím, co jádro vyžaduje. Pokud datový typ elementů v přidělení neodpovídá datovému typu, který jádro očekává, vyvolá se výjimka.
Všechna jádra Renderscriptu budou zabalena typem, který je potomkem Android.Renderscripts.Script
Třída. Třída Script
se používá k nastavení parametrů pro Renderscript, nastavte odpovídající Allocations
a spusťte Renderscript. V sadě Android SDK existují dvě Script
podtřídy:
Android.Renderscripts.ScriptIntrinsic
– Některé z nejběžnějších úloh renderscriptu jsou součástí sady Android SDK a jsou přístupné podtřídou Třídy ScriptIntrinsic . Vývojář nemusí provádět žádné další kroky pro použití těchto skriptů ve své aplikaci, protože už jsou k dispozici.ScriptC_XXXXX
– Označuje se také jako uživatelské skripty, jedná se o skripty napsané vývojáři a zabalené v APK. V době kompilace vygeneruje sada nástrojů pro Android spravované třídy obálky, které umožní použití skriptů v aplikaci pro Android. Název těchto vygenerovaných tříd je název renderscriptového souboru s předponouScriptC_
. Xamarin.Android oficiálně nepodporuje psaní a začlenění uživatelských skriptů ani nad rámec tohoto průvodce.
Z těchto dvou typů je podporováno pouze StringIntrinsic
Xamarin.Android. Tato příručka popisuje, jak používat vnitřní skripty v aplikaci Xamarin.Android.
Požadavky
Tato příručka je určená pro aplikace Xamarin.Android, které cílí na úroveň rozhraní API 17 nebo vyšší. Použití uživatelských skriptů se v této příručce nezabývá.
Knihovna podpory Xamarin.Android V8 backportuje rozhraní API pro instrinsic Renderscript pro aplikace, které cílí na starší verze sady Android SDK. Přidání tohoto balíčku do projektu Xamarin.Android by mělo umožnit aplikacím, které cílí na starší verze sady Android SDK, využívat vnitřní skripty.
Použití vnitřních renderscriptů v Xamarin.Androidu
Vnitřní skripty představují skvělý způsob, 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 nabízely optimální výkon u velkého průřezu zařízení. Není neobvyklé, že vnitřní skript spustí 10x rychleji než spravovaný kód a 2-3x po více než vlastní implementaci jazyka C. Mnoho typických scénářů zpracování se zabývá vnitřními 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 – poskytuje vysoce výkonné rozhraní API renderscriptu pro BLAS. BlaS (základní lineární algebra podprogramy) jsou rutiny, které poskytují standardní stavební bloky pro provádění základních vektorových a maticových operací.
ScriptIntrinsicBlend – Promíchá dva přidělení dohromady.
ScriptIntrinsicBlur – použije Gaussian blur na přidělení.
ScriptIntrinsicColorMatrix – Použije barevnou matici pro přidělení (tj. změnit barvy, upravit odstín).
ScriptIntrinsicConvolve3x3 – použije 3x3 barevnou matici pro přidělení.
ScriptIntrinsicConvolve5x5 – použije 5x5 barevnou matici pro přidělení.
ScriptIntrinsicHistogram – vnitřní filtr histogramu.
ScriptIntrinsicLUT – použije vyhledávací tabulku pro jednotlivé kanály do vyrovnávací paměti.
ScriptIntrinsicResize – skript pro provádění změny velikosti přidělení 2D.
ScriptIntrinsicYuvToRGB – Převede vyrovnávací paměť YUV na RGB.
Podrobnosti o jednotlivých vnitřních skriptech najdete v dokumentaci k rozhraní API.
Dále jsou popsány základní kroky pro použití renderscriptu v aplikaci pro Android.
Vytvoření kontextu renderscriptu – Renderscript
třída je spravovaný obálka kolem kontextu Renderscript a bude řídit inicializaci, správu prostředků a vyčištění. Renderscript objekt je vytvořen pomocí RenderScript.Create
objektu továrny metoda, která přebírá Kontext Androidu (například Aktivita) jako parametr. Následující řádek kódu ukazuje, jak inicializovat kontext Renderscriptu:
Android.Renderscripts.RenderScript renderScript = RenderScript.Create(this);
Vytvořit přidělení – V závislosti na vnitřním skriptu může být nutné vytvořit jeden nebo dva Allocation
s. Android.Renderscripts.Allocation
třída má několik metod výroby, které pomáhají vytvořit instanci přidělení pro vnitřní. Například následující fragment kódu ukazuje, jak vytvořit přidělení pro bitmapy.
Android.Graphics.Bitmap originalBitmap;
Android.Renderscripts.Allocation inputAllocation = Allocation.CreateFromBitmap(renderScript,
originalBitmap,
Allocation.MipmapControl.MipmapFull,
AllocationUsage.Script);
Často bude nutné vytvořit Allocation
pro uložení výstupních dat skriptu. Následující fragment kódu ukazuje, jak pomocí pomocné rutiny Allocation.CreateTyped
vytvořit instanci sekundy Allocation
stejného typu jako původní:
Android.Renderscripts.Allocation outputAllocation = Allocation.CreateTyped(renderScript, inputAllocation.Type);
Vytvoření instance obálky skriptu – Každá z vnitřních tříd obálky skriptu by měla mít pomocné metody (obvykle označované Create
)pro vytvoření instance objektu obálky pro tento skript. Následující fragment kódu je příkladem vytvoření instance rozostření objektu ScriptIntrinsicBlur
. Pomocná Element.U8_4
metoda vytvoří element, který popisuje datový typ, který je 4 pole 8bitové, bez znaménka celočíselné hodnoty, vhodné pro uchovávání dat objektu Bitmap
:
Android.Renderscripts.ScriptIntrinsicBlur blurScript = ScriptIntrinsicBlur.Create(renderScript, Element.U8_4(renderScript));
Assign Allocation(s), Set Parameters, &Run Script – Třída Script
poskytuje metodu ForEach
pro skutečné spuštění Renderscriptu. Tato metoda bude iterovat nad jednotlivými Element
vstupními Allocation
daty. V některýchpřípadechch Allocation
ForEach
přepíše obsah výstupního přidělení. Pokud chcete pokračovat s 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édnout rozostření obrázku s receptem renderscriptu , je to úplný příklad použití vnitřního skriptu v Xamarin.Androidu.
Shrnutí
Tato příručka představila renderscript a způsob jeho použití v aplikaci Xamarin.Android. Stručně probrala, 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 instrinsickými skripty. Nakonec tento průvodce probíral kroky použití vnitřního skriptu v aplikaci Xamarin.Android.