Introduzione a Renderscript
Questa guida presenta Renderscript e spiega come usare l'API Renderscript intrinseca in un'applicazione Xamarin.Android destinata al livello API 17 o superiore.
Panoramica
Renderscript è un framework di programmazione creato da Google allo scopo di migliorare le prestazioni delle applicazioni Android che richiedono risorse di calcolo estese. Si tratta di un'API a basso livello e ad alte prestazioni basata su C99. Poiché si tratta di un'API di basso livello che verrà eseguita su CPU, GPU o DSP, Renderscript è ideale per le app Android che potrebbero dover eseguire una delle operazioni seguenti:
- Grafica
- Elaborazione immagini
- Crittografia
- Elaborazione dei segnali
- Routine matematiche
Renderscript userà clang
e compilerà gli script in codice di byte LLVM, incluso nell'APK. Quando l'app viene eseguita per la prima volta, il codice di byte LLVM verrà compilato nel codice del computer per i processori nel dispositivo. Questa architettura consente a un'applicazione Android di sfruttare i vantaggi del codice del computer senza che gli sviluppatori stessi devono scriverlo per ogni processore nel dispositivo stesso.
Esistono due componenti di una routine Renderscript:
Il runtime renderscript: si tratta delle API native responsabili dell'esecuzione di Renderscript. Sono inclusi tutti i renderscript scritti per l'applicazione.
Wrapper gestiti da Android Framework : classi gestite che consentono a un'app Android di controllare e interagire con il runtime e gli script renderscript. Oltre alle classi fornite dal framework per controllare il runtime Renderscript, la toolchain Android esaminerà il codice sorgente Renderscript e genererà classi wrapper gestite da usare dall'applicazione Android.
Il diagramma seguente illustra la correlazione tra questi componenti:
Esistono tre concetti importanti per l'uso di Renderscript in un'applicazione Android:
Contesto: UN'API gestita fornita da Android SDK che alloca le risorse a Renderscript e consente all'app Android di passare e ricevere dati da Renderscript.
Un kernel di calcolo: noto anche come kernel radice o kernel, questa routine che esegue il lavoro. Il kernel è molto simile a una funzione C; si tratta di una routine parallelizzabile che verrà eseguita su tutti i dati nella memoria allocata.
Memoria allocata: i dati vengono passati a e da un kernel tramite un'allocazione. Un kernel può avere un input e/o un'allocazione di output.
Lo spazio dei nomi Android.Renderscripts contiene le classi per interagire con il runtime Renderscript. In particolare, la Renderscript
classe gestirà il ciclo di vita e le risorse del motore Renderscript. L'app Android deve inizializzare uno o più Android.Renderscripts.Allocation
Oggetti. Un'allocazione è un'API gestita responsabile dell'allocazione e dell'accesso alla memoria condivisa tra l'app Android e il runtime Renderscript. In genere, viene creata un'allocazione per l'input e, facoltativamente, viene creata un'altra allocazione per contenere l'output del kernel. Il motore di runtime Renderscript e le classi wrapper gestite associate gestiranno l'accesso alla memoria contenuta nelle allocazioni, non è necessario che uno sviluppatore di app Android esegua alcun lavoro aggiuntivo.
Un'allocazione conterrà uno o più elementi Android.Renderscripts.Elements. Gli elementi sono un tipo specializzato che descrive i dati in ogni allocazione. I tipi di elemento dell'allocazione di output devono corrispondere ai tipi dell'elemento di input. Durante l'esecuzione, un oggetto Renderscript scorrerà ogni elemento nell'allocazione di input in parallelo e scriverà i risultati nell'allocazione di output. Esistono due tipi di elementi:
tipo semplice: concettualmente si tratta dello stesso tipo di
float
dati C o di un oggettochar
.tipo complesso: questo tipo è simile a un oggetto C
struct
.
Il motore Renderscript eseguirà un controllo di runtime per assicurarsi che gli elementi in ogni allocazione siano compatibili con ciò che è richiesto dal kernel. Se il tipo di dati degli elementi nell'allocazione non corrisponde al tipo di dati previsto dal kernel, verrà generata un'eccezione.
Tutti i kernel Renderscript verranno sottoposti a wrapping da un tipo discendente del ClasseAndroid.Renderscripts.Script
. La Script
classe viene usata per impostare i parametri per un Oggetto Renderscript, impostare l'oggetto appropriato Allocations
ed eseguire Renderscript. In Android SDK sono disponibili due Script
sottoclassi:
Android.Renderscripts.ScriptIntrinsic
: alcune delle attività Renderscript più comuni sono raggruppate in Android SDK e sono accessibili da una sottoclasse della classe ScriptIntrinsic . Non è necessario che uno sviluppatore eseeseguono passaggi aggiuntivi per usare questi script nell'applicazione, perché sono già stati forniti.ScriptC_XXXXX
– Noto anche come script utente, questi sono script scritti dagli sviluppatori e inseriti nel pacchetto nell'APK. In fase di compilazione, la toolchain Android genererà classi wrapper gestite che consentiranno l'uso degli script nell'app Android. Il nome di queste classi generate è il nome del file Renderscript, preceduto daScriptC_
. La scrittura e l'incorporamento di script utente non sono ufficialmente supportati da Xamarin.Android e non rientrano nell'ambito di questa guida.
Di questi due tipi, solo StringIntrinsic
il è supportato da Xamarin.Android. Questa guida illustra come usare script intrinseci in un'applicazione Xamarin.Android.
Requisiti
Questa guida è destinata alle applicazioni Xamarin.Android destinate al livello API 17 o superiore. L'uso degli script utente non è trattato in questa guida.
La libreria di supporto di Xamarin.Android V8 esegue il backporting dell'API Renderscript instrinsic per le app destinate alle versioni precedenti di Android SDK. L'aggiunta di questo pacchetto a un progetto Xamarin.Android deve consentire alle app destinate alle versioni precedenti di Android SDK di sfruttare gli script intrinseci.
Uso di rendering intrinseci in Xamarin.Android
Gli script intrinseci sono un ottimo modo per eseguire attività di elaborazione intensive con una quantità minima di codice aggiuntivo. Sono stati ottimizzati a mano per offrire prestazioni ottimali su una grande sezione trasversale di dispositivi. Non è raro che uno script intrinseco venga eseguito 10 volte più velocemente rispetto al codice gestito e 2-3 volte dopo un'implementazione C personalizzata. Molti degli scenari di elaborazione tipici sono coperti dagli script intrinseci. Questo elenco degli script intrinseci descrive gli script correnti in Xamarin.Android:
ScriptIntrinsic3DLUT : converte RGB in RGBA usando una tabella di ricerca 3D.
ScriptIntrinsicBLAS : fornisce api Renderscript con prestazioni elevate per BLAS. Le routine BLAS (Basic Linear Algebra Subprograms) sono routine che forniscono blocchi predefiniti standard per l'esecuzione di operazioni di base su vettori e matrici.
ScriptIntrinsicBlend : combina due allocazioni.
ScriptIntrinsicBlur : applica una sfocatura gaussiana a un'allocazione.
ScriptIntrinsicColorMatrix : applica una matrice di colori a un'allocazione (ad esempio, modificare i colori, regolare la tonalità).
ScriptIntrinsicConvolve3x3 : applica una matrice di colori 3x3 a un'allocazione.
ScriptIntrinsicConvolve5x5 : applica una matrice di colori 5x5 a un'allocazione.
ScriptIntrinsicHistogram: filtro istogramma intrinseco.
ScriptIntrinsicLUT : applica una tabella di ricerca per canale a un buffer.
ScriptIntrinsicResize : script per l'esecuzione del ridimensionamento di un'allocazione 2D.
ScriptIntrinsicYuvToRGB : converte un buffer YUV in RGB.
Per informazioni dettagliate su ognuno degli script intrinseci, vedere la documentazione dell'API.
I passaggi di base per l'uso di Renderscript in un'applicazione Android sono descritti di seguito.
Creare un contesto Renderscript : Renderscript
la classe è un wrapper gestito intorno al contesto Renderscript e controlla l'inizializzazione, la gestione delle risorse e la pulizia. L'oggetto Renderscript viene creato usando il RenderScript.Create
metodo factory, che accetta un contesto Android (ad esempio un'attività) come parametro. La riga di codice seguente illustra come inizializzare il contesto Renderscript:
Android.Renderscripts.RenderScript renderScript = RenderScript.Create(this);
Crea allocazioni : a seconda dello script intrinseco, potrebbe essere necessario crearne uno o due Allocation
. La Android.Renderscripts.Allocation
La classe include diversi metodi factory per facilitare la creazione di un'istanza di un'allocazione per un oggetto intrinseco. Ad esempio, il frammento di codice seguente illustra come creare Allocazione per bitmap.
Android.Graphics.Bitmap originalBitmap;
Android.Renderscripts.Allocation inputAllocation = Allocation.CreateFromBitmap(renderScript,
originalBitmap,
Allocation.MipmapControl.MipmapFull,
AllocationUsage.Script);
Spesso sarà necessario creare un oggetto Allocation
per contenere i dati di output di uno script. Questo frammento di codice seguente illustra come usare l'helper Allocation.CreateTyped
per creare un'istanza di un secondo Allocation
dello stesso tipo dell'originale:
Android.Renderscripts.Allocation outputAllocation = Allocation.CreateTyped(renderScript, inputAllocation.Type);
Creare un'istanza del wrapper script: ognuna delle classi wrapper dello script intrinseco deve avere metodi helper (in genere chiamati Create
)per creare un'istanza di un oggetto wrapper per tale script. Il frammento di codice seguente è un esempio di come creare un'istanza di un ScriptIntrinsicBlur
oggetto sfocatura. Il Element.U8_4
metodo helper creerà un elemento che descrive un tipo di dati costituito da 4 campi di valori integer senza segno a 8 bit, adatti per contenere i dati di un Bitmap
oggetto :
Android.Renderscripts.ScriptIntrinsicBlur blurScript = ScriptIntrinsicBlur.Create(renderScript, Element.U8_4(renderScript));
Assegna allocazioni, Set Parameters e Run Script : la Script
classe fornisce un ForEach
metodo per eseguire effettivamente il Renderscript. Questo metodo eseguirà l'iterazione su ogni Element
oggetto contenente Allocation
i dati di input. In alcuni casi, potrebbe essere necessario specificare un Allocation
oggetto che contiene l'output.
ForEach
sovrascriverà il contenuto dell'allocazione dell'output. Per continuare con i frammenti di codice dei passaggi precedenti, in questo esempio viene illustrato come assegnare un'allocazione di input, impostare un parametro e infine eseguire lo script (copiando i risultati nell'allocazione di output):
blurScript.SetInput(inputAllocation);
blurScript.SetRadius(25); // Set a pamaeter
blurScript.ForEach(outputAllocation);
È possibile consultare la ricetta Sfocatura di un'immagine con Renderscript , è un esempio completo di come usare uno script intrinseco in Xamarin.Android.
Riepilogo
Questa guida ha introdotto Renderscript e come usarlo in un'applicazione Xamarin.Android. Descrive brevemente che cos'è Renderscript e come funziona in un'applicazione Android. Descrive alcuni dei componenti chiave in Renderscript e la differenza tra gli script utente e gli script instrinsic. Infine, questa guida ha illustrato i passaggi descritti nell'uso di uno script intrinseco in un'applicazione Xamarin.Android.