Udostępnij za pośrednictwem


Wprowadzenie do renderowania

W tym przewodniku przedstawiono język Renderscript i wyjaśniono, jak używać wewnętrznych interfejsów API renderowania w aplikacji platformy Xamarin.Android, która jest przeznaczona dla interfejsu API na poziomie 17 lub wyższym.

Omówienie

Renderscript to struktura programowania utworzona przez firmę Google w celu poprawy wydajności aplikacji systemu Android, które wymagają rozbudowanych zasobów obliczeniowych. Jest to interfejs API o niskiej wydajności oparty na języku C99. Ponieważ jest to interfejs API niskiego poziomu, który będzie uruchamiany na procesorach CPU, procesorach GPU lub procesorach DSP, renderscript jest dobrze odpowiedni dla aplikacji systemu Android, które mogą wymagać wykonania dowolnej z następujących czynności:

  • Karty graficzne
  • Przetwarzanie obrazu
  • Szyfrowanie
  • Przetwarzanie sygnału
  • Procedury matematyczne

Renderscript będzie używać clang i kompilować skrypty do kodu bajtowego LLVM, który jest powiązany z pakietem APK. Po pierwszym uruchomieniu aplikacji kod bajtowy LLVM zostanie skompilowany w kodzie maszynowym dla procesorów na urządzeniu. Ta architektura umożliwia aplikacji systemu Android wykorzystanie zalet kodu maszynowego bez konieczności samodzielnego pisania go przez deweloperów dla każdego procesora na urządzeniu.

Istnieją dwa składniki procedury renderowania:

  1. Środowisko uruchomieniowe renderowania — jest to natywne interfejsy API, które są odpowiedzialne za wykonywanie renderowania. Obejmuje to wszystkie skrypty renderowane napisane dla aplikacji.

  2. Zarządzane otoki z platformy Android — klasy zarządzane, które umożliwiają aplikacji dla systemu Android kontrolowanie środowiska uruchomieniowego i skryptów renderscript oraz interakcję z nimi. Oprócz platform udostępnionych klas do kontrolowania środowiska uruchomieniowego renderowania łańcuch narzędzi systemu Android zbada kod źródłowy renderscript i wygeneruje zarządzane klasy otoki do użycia przez aplikację systemu Android.

Na poniższym diagramie pokazano, jak te składniki są powiązane:

Diagram illustrating how the Android Framework interacts with the Renderscript Runtime

Istnieją trzy ważne pojęcia dotyczące używania skryptów Renderscript w aplikacji systemu Android:

  1. Kontekst — zarządzany interfejs API udostępniany przez zestaw SDK systemu Android, który przydziela zasoby do języka Renderscript i umożliwia aplikacji dla systemu Android przekazywanie i odbieranie danych z renderowania.

  2. Jądro obliczeniowe — znane również jako główne jądro lub jądro, jest to rutyna, która wykonuje tę pracę. Jądro jest bardzo podobne do funkcji C; jest to procedurę równoległą, która będzie uruchamiana na wszystkich danych w przydzielonej pamięci .

  3. Przydzielona pamięć — dane są przekazywane do i z jądra za pośrednictwem alokacji. Jądro może mieć jedno wejście i/lub jedną alokację danych wyjściowych.

Przestrzeń nazw Android.Renderscripts zawiera klasy umożliwiające interakcję ze środowiskiem uruchomieniowym renderscript. W szczególności Renderscript klasa będzie zarządzać cyklem życia i zasobami aparatu renderscript. Aplikacja systemu Android musi zainicjować co najmniej jedną aplikację systemu Android Android.Renderscripts.Allocation Obiektów. Alokacja to zarządzany interfejs API, który jest odpowiedzialny za alokację i uzyskiwanie dostępu do pamięci udostępnionej między aplikacją systemu Android a środowiskiem uruchomieniowym renderscript. Zazwyczaj jedna alokacja jest tworzona dla danych wejściowych, a opcjonalnie inna alokacja jest tworzona w celu przechowywania danych wyjściowych jądra. Aparat środowiska uruchomieniowego renderowania i skojarzone klasy zarządzanej otoki będą zarządzać dostępem do pamięci przechowywanej przez alokacje. Deweloper aplikacji systemu Android nie musi wykonywać żadnych dodatkowych zadań.

Alokacja będzie zawierać co najmniej jeden element Android.Renderscripts.Elements. Elementy to wyspecjalizowany typ, który opisuje dane w każdej alokacji. Typy elementów wyjściowych Alokacja muszą być zgodne z typami elementu wejściowego. Podczas wykonywania skrypt renderujący będzie iterować poszczególne elementy w wejściowej alokacji równolegle i zapisywać wyniki w wyjściowej alokacji. Istnieją dwa typy elementów:

  • prosty typ — koncepcyjnie jest to samo, co typ float danych C lub char.

  • typ złożony — ten typ jest podobny do typu C struct.

Aparat renderowania wykona kontrolę środowiska uruchomieniowego, aby upewnić się, że elementy w każdej alokacji są zgodne z elementami wymaganymi przez jądro. Jeśli typ danych elementów w alokacji nie jest zgodny z typem danych oczekiwanym przez jądro, zostanie zgłoszony wyjątek.

Wszystkie jądra renderowania zostaną opakowane przez typ, który jest elementem potomnym elementu Android.Renderscripts.Script Klasa. Klasa Script służy do ustawiania parametrów dla skryptu renderscript, ustawiania odpowiedniego Allocationselementu i uruchamiania skryptu Renderscript. Istnieją dwie Script podklasy w zestawie SDK systemu Android:

  • Android.Renderscripts.ScriptIntrinsic — Niektóre z bardziej typowych zadań renderowania są umieszczane w zestawie SDK systemu Android i są dostępne dla podklasy klasy ScriptIntrinsic . Deweloper nie musi wykonywać żadnych dodatkowych kroków, aby użyć tych skryptów w swojej aplikacji, ponieważ zostały już udostępnione.

  • ScriptC_XXXXX — nazywane również skryptami użytkowników, są to skrypty napisane przez deweloperów i spakowane w pakiecie APK. W czasie kompilacji łańcuch narzędzi systemu Android wygeneruje zarządzane klasy otoki, które umożliwią używanie skryptów w aplikacji systemu Android. Nazwa tych wygenerowanych klas to nazwa pliku Renderscript poprzedzona prefiksem ScriptC_. Pisanie i dołączanie skryptów użytkownika nie jest oficjalnie obsługiwane przez platformę Xamarin.Android i wykracza poza zakres tego przewodnika.

Spośród tych dwóch typów tylko te StringIntrinsic typy są obsługiwane przez platformę Xamarin.Android. W tym przewodniku omówiono sposób używania skryptów wewnętrznych w aplikacji platformy Xamarin.Android.

Wymagania

Ten przewodnik dotyczy aplikacji platformy Xamarin.Android przeznaczonych dla interfejsu API na poziomie 17 lub wyższym. Korzystanie ze skryptów użytkownika nie zostało omówione w tym przewodniku.

Biblioteka obsługi platformy Xamarin.Android w wersji 8 przywraca instrymiczne interfejsy API renderowania dla aplikacji przeznaczonych dla starszych wersji zestawu Android SDK. Dodanie tego pakietu do projektu platformy Xamarin.Android powinno umożliwić aplikacjom przeznaczonym dla starszych wersji zestawu Android SDK korzystanie ze skryptów wewnętrznych.

Używanie wewnętrznych skryptów renderowanych na platformie Xamarin.Android

Skrypty wewnętrzne to doskonały sposób wykonywania intensywnych zadań obliczeniowych z minimalną ilością dodatkowego kodu. Zostały one dostrojone w celu zapewnienia optymalnej wydajności na dużych przekrojach urządzeń. Nie jest niczym niezwykłym, że skrypt wewnętrzny działa 10 razy szybciej niż zarządzany kod i 2–3 razy po niż niestandardowa implementacja języka C. Wiele typowych scenariuszy przetwarzania jest objętych skryptami wewnętrznymi. Ta lista skryptów wewnętrznych opisuje bieżące skrypty na platformie Xamarin.Android:

Aby uzyskać szczegółowe informacje na temat każdego skryptu wewnętrznego, zapoznaj się z dokumentacją interfejsu API.

Poniżej opisano podstawowe kroki korzystania z języka Renderscript w aplikacji systemu Android.

Tworzenie kontekstu renderowania — Renderscript klasa jest zarządzaną otoką wokół kontekstu renderowania i będzie kontrolować inicjowanie, zarządzanie zasobami i czyszczenie. Obiekt Renderscript jest tworzony przy użyciu RenderScript.Create metody factory, która przyjmuje kontekst systemu Android (na przykład Działanie) jako parametr. Poniższy wiersz kodu pokazuje, jak zainicjować kontekst renderowania:

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

Tworzenie alokacji — w zależności od skryptu wewnętrznego może być konieczne utworzenie jednego lub dwóch Allocations. Standard Android.Renderscripts.Allocation klasa ma kilka metod fabrycznych, które ułatwiają utworzenie wystąpienia alokacji dla elementu wewnętrznego. Na przykład poniższy fragment kodu pokazuje, jak utworzyć alokację dla map bitowych.

Android.Graphics.Bitmap originalBitmap;
Android.Renderscripts.Allocation inputAllocation = Allocation.CreateFromBitmap(renderScript,
                                                     originalBitmap,
                                                     Allocation.MipmapControl.MipmapFull,
                                                     AllocationUsage.Script);

Często konieczne będzie utworzenie obiektu Allocation w celu przechowywania danych wyjściowych skryptu. Poniższy fragment kodu pokazuje, jak użyć Allocation.CreateTyped pomocnika do utworzenia wystąpienia sekundy Allocation , która jest taka sama jak oryginalna:

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

Utworzenie wystąpienia otoki skryptu — każda z klas otoki skryptów wewnętrznych powinna mieć metody pomocnicze (zwykle nazywane Create)do tworzenia wystąpienia obiektu otoki dla tego skryptu. Poniższy fragment kodu to przykład tworzenia wystąpienia ScriptIntrinsicBlur obiektu rozmycia. Metoda Element.U8_4 pomocnika utworzy element opisujący typ danych, który zawiera 4 pola 8-bitowych, niepodpisanych wartości całkowitych, odpowiednie do przechowywania danych Bitmap obiektu:

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

Przypisywanie alokacji, ustawianie parametrów i uruchamianie skryptuScript klasa udostępnia metodę ForEach faktycznego uruchamiania skryptu renderscript. Ta metoda wykonuje iterację każdej Element z nich w przechowywaniu Allocation danych wejściowych. W niektórych przypadkach może być konieczne podanie elementu przechowującego Allocation dane wyjściowe. ForEach spowoduje zastąpienie zawartości wyjściowej alokacji. Aby kontynuować fragmenty kodu z poprzednich kroków, w tym przykładzie pokazano, jak przypisać alokację wejściową, ustawić parametr, a następnie uruchomić skrypt (skopiowanie wyników do wyjściowej alokacji):

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

Możesz zapoznać się z przepisem Blur an Image with Renderscript (Blur an Image with Renderscript ), jest to kompletny przykład użycia skryptu wewnętrznego na platformie Xamarin.Android.

Podsumowanie

W tym przewodniku przedstawiono język Renderscript i sposób jego używania w aplikacji platformy Xamarin.Android. Krótko omówił to, co to jest język RenderScript i jak działa w aplikacji systemu Android. Opisano w nim niektóre kluczowe składniki w języku Renderscript oraz różnicę między skryptami użytkownika i skryptami instrygowymi. Na koniec w tym przewodniku omówiono kroki używania skryptu wewnętrznego w aplikacji platformy Xamarin.Android.