Renderscript 소개An Introduction to Renderscript

이 가이드에서는 Renderscript를 소개 하 고 API 레벨 17 이상을 대상으로 하는 Xamarin Android 응용 프로그램에서 내장 Renderscript API를 사용 하는 방법을 설명 합니다.This guide introduces Renderscript and explains how to use the intrinsic Renderscript API's in a Xamarin.Android application that targets API level 17 or higher.

개요Overview

Renderscript는 광범위 한 계산 리소스를 필요로 하는 Android 응용 프로그램의 성능을 향상 시키기 위해 Google에서 만든 프로그래밍 프레임 워크입니다.Renderscript is a programming framework created by Google for the purpose of improving the performance of Android applications that require extensive computational resources. C99을 기반으로 하는 낮은 수준의 고성능 API입니다.It is a low level, high performance API based on C99. Cpu, Gpu 또는 Dsp에서 실행 되는 하위 수준 API 이므로 Renderscript는 다음 작업을 수행 해야 할 수 있는 Android 앱에 적합 합니다.Because it is a low level API that will run on CPUs, GPUs, or DSPs, Renderscript is well suited for Android apps that may need to perform any of the following:

  • 그래픽Graphics
  • 이미지 처리Image Processing
  • 암호화Encryption
  • 신호 처리Signal Processing
  • 수학 루틴Mathematical Routines

Renderscript는 clang을 사용 하 고 APK에 번들로 제공 되는 바이트 코드를 LLVM 스크립트를 컴파일합니다.Renderscript will use clang and compile the scripts to LLVM byte code which is bundled into the APK. 앱이 처음으로 실행 될 때 LLVM 바이트 코드는 장치의 프로세서에 대 한 기계어 코드로 컴파일됩니다.When the app is run for the first time, the LLVM byte code will be compiled into machine code for the processors on the device. 이 아키텍처를 통해 Android 응용 프로그램은 개발자가 장치 자체의 각 프로세서에 대 한 코드를 작성 하지 않고도 컴퓨터 코드의 이점을 활용할 수 있습니다.This architecture allows an Android application to exploit the advantages of machine code without the developers themselves having to write it for each processor on the device themselves.

Renderscript 루틴에는 두 가지 구성 요소가 있습니다.There are two components to a Renderscript routine:

  1. Renderscript 런타임은 renderscript를 실행 하는 네이티브 api를 – 합니다.The Renderscript runtime – This is the native APIs that are responsible for executing the Renderscript. 여기에는 응용 프로그램에 대해 작성 된 모든 Renderscripts가 포함 됩니다.This includes any Renderscripts written for the application.

  2. Android 앱이 Renderscript 런타임과 스크립트를 제어 하 고 조작할 수 있도록 하는 관리 되는 클래스 – Android Framework의 관리 되는 래퍼입니다 .Managed Wrappers from the Android Framework – Managed classes that allow an Android app to control and interact with the Renderscript runtime and scripts. Renderscript runtime을 제어 하기 위한 프레임 워크 제공 클래스 외에도 Android 도구 체인는 Renderscript 소스 코드를 검사 하 고 Android 응용 프로그램에서 사용할 관리 되는 래퍼 클래스를 생성 합니다.In addition to the framework provided classes for controlling the Renderscript runtime, the Android toolchain will examine the Renderscript source code and generate managed wrapper classes for use by the Android application.

다음 다이어그램에서는 이러한 구성 요소가 어떻게 관련 되는지를 보여 줍니다.The following diagram illustrates how these components relate:

Android Framework가 Renderscript 런타임과 상호 작용 하는 방식을 보여 주는 다이어그램

Android 응용 프로그램에서 Renderscripts를 사용 하는 데는 다음과 같은 세 가지 중요 한 개념이 있습니다.There are three important concepts for using Renderscripts in an Android application:

  1. Renderscript에 리소스를 할당 하 고 Android 앱이 Renderscript에서 데이터를 전달 하 고 받을 수 있도록 하는 Android SDK에서 제공 하는 관리 되는 API – 컨텍스트입니다 .A context – A managed API provided by the Android SDK that allocates resources to Renderscript and allows the Android app to pass and receive data from the Renderscript.

  2. 루트 커널 또는 _커널이_라고도 하는 계산 커널 – 작업을 수행 하는 루틴입니다.A compute kernel – Also known as the root kernel or kernel, this a routine that does the work. 커널은 C 함수와 매우 유사 합니다. 할당 된 메모리의 모든 데이터에 대해 실행 되는 병렬화 루틴입니다.The kernel is very similar to a C function; it is a parallelizable routine that will be run over all the data in allocated memory .

  3. 할당 된 메모리 – 데이터는 할당 을 통해 커널에 전달 됩니다.Allocated Memory – Data is passed to and from a kernel through an Allocation. 커널에는 하나의 입력 및/또는 하나의 출력 할당이 있을 수 있습니다.A kernel may have one input and/or one output Allocation.

Android Renderscripts 네임 스페이스는 renderscripts 런타임과 상호 작용 하기 위한 클래스를 포함 합니다.The Android.Renderscripts namespace contains the classes for interacting with the Renderscript runtime. 특히 Renderscript 클래스는 renderscript 엔진의 수명 주기와 리소스를 관리 합니다.In particular, the Renderscript class will manage the lifecycle and resources of the Renderscript engine. Android 앱은 하나 이상의 Android.Renderscripts.Allocation 을 초기화 해야 합니다.The Android app must initialize one or more Android.Renderscripts.Allocation 개체가.objects. 할당은 Android 앱과 Renderscript 런타임 간에 공유 되는 메모리를 할당 하 고 액세스 하는 관리 되는 API입니다.An Allocation is a managed API that is responsible for allocation and accessing the memory that is shared between the Android app and the Renderscript runtime. 일반적으로 하나의 할당은 입력에 대해 생성 되 고, 선택적으로 다른 할당을 만들어 커널 출력을 저장할 수 있습니다.Typically, one Allocation is created for input, and optionally another Allocation is created to hold the output of the kernel. Renderscript 런타임 엔진과 연결 된 관리 되는 래퍼 클래스는 할당에 저장 된 메모리에 대 한 액세스를 관리 하므로 Android 앱 개발자가 추가 작업을 수행할 필요가 없습니다.The Renderscript runtime engine and the associated managed wrapper classes will manage access to the memory held by the Allocations, there is no need for an Android app developer to do any extra work.

할당에는 하나 이상의 Android Renderscripts. 요소가포함 됩니다.An Allocation will contain one or more Android.Renderscripts.Elements. 요소는 각 할당의 데이터를 설명 하는 특수 한 형식입니다.Elements are a specialized type that describe data in each Allocation. 출력 할당의 요소 형식은 입력 요소의 형식과 일치 해야 합니다.The Element types of the output Allocation must match the types of the input Element. 실행 시 Renderscript는 입력 할당의 각 요소를 병렬로 반복 하 고 결과를 출력 할당에 씁니다.When executing, a Renderscript will iterate over each Element in the input Allocation in parallel, and write the results to the output Allocation. 다음과 같은 두 가지 유형의 요소가 있습니다.There are two types of Elements:

  • 단순 형식 – 개념적으로이는 C 데이터 형식 float 또는 char와 동일 합니다.simple type – Conceptually this is the same as a C data type, float or a char.

  • 복합 형식 –이 형식은 C struct와 비슷합니다.complex type – This type is similar to a C struct.

Renderscript 엔진은 각 할당의 요소가 커널에 필요한 항목과 호환 되는지 확인 하기 위해 런타임 검사를 수행 합니다.The Renderscript engine will perform a runtime check to ensure that the Elements in each Allocation are compatible with what is required by the kernel. 할당에 있는 요소의 데이터 형식이 커널에서 예상 하는 데이터 형식과 일치 하지 않는 경우 예외가 throw 됩니다.If the data type of the Elements in the Allocation do not match the data type that the kernel is expecting, an exception will be thrown.

모든 Renderscript 커널은 Android.Renderscripts.Script 하위 항목인 형식으로 래핑됩니다.All Renderscript kernels will be wrapped by a type that is a descendant of the Android.Renderscripts.Script 클래스.class. Script 클래스는 Renderscript에 대 한 매개 변수를 설정 하 고, 적절 한 Allocations를 설정 하 고, Renderscript를 실행 하는 데 사용 됩니다.The Script class is used to set parameters for a Renderscript, set the appropriate Allocations, and run the Renderscript. Android SDK에는 두 개의 Script 하위 클래스가 있습니다.There are two Script subclasses in the Android SDK:

  • Android.Renderscripts.ScriptIntrinsic – 일반적인 renderscript 태스크 중 일부는 Android SDK에 번들로 제공 되며 scriptintrinsic 클래스의 서브 클래스에서 액세스할 수 있습니다.Android.Renderscripts.ScriptIntrinsic – Some of the more common Renderscript tasks are bundled in the Android SDK and are accessible by a subclass of the ScriptIntrinsic class. 개발자가 응용 프로그램에서 이러한 스크립트를 사용 하기 위해 이미 제공 된 추가 단계를 수행할 필요가 없습니다.There is no need for a developer take any extra steps to use these scripts in their application as they are already provided.

  • _사용자 스크립트_라고도 하는 ScriptC_XXXXX –는 개발자가 작성 하 고 apk에 패키지 된 스크립트입니다.ScriptC_XXXXX – Also known as user scripts, these are scripts that are written by developers and packaged in the APK. 컴파일 시간에 Android 도구 체인는 Android 앱에서 스크립트를 사용할 수 있는 관리 되는 래퍼 클래스를 생성 합니다.At compile time, the Android toolchain will generate managed wrapper classes that will allow the scripts to be used in the Android app. 이러한 생성 된 클래스의 이름은 Renderscript 파일의 이름이 며 ScriptC_접두사가 붙습니다.The name of these generated classes is the name of the Renderscript file, prefixed with ScriptC_. 사용자 스크립트를 작성 하 고 통합 하는 것은이 가이드의 범위를 벗어나 Xamarin. Android에서 공식적으로 지원 되지 않습니다.Writing and incorporating user scripts is not officially supported by Xamarin.Android and beyond the scope of this guide.

이러한 두 가지 형식 중에는 StringIntrinsic만 Xamarin.ios에서 지원 됩니다.Of these two types, only the StringIntrinsic is supported by Xamarin.Android. 이 가이드에서는 Xamarin Android 응용 프로그램에서 내장 스크립트를 사용 하는 방법을 설명 합니다.This guide will discuss how to use intrinsic scripts in a Xamarin.Android application.

요구 사항Requirements

이 가이드는 API 레벨 17 이상을 대상으로 하는 Xamarin Android 응용 프로그램을 위한 것입니다.This guide is for Xamarin.Android applications that target API level 17 or higher. 사용자 스크립트 를 사용 하는 방법은이 가이드에서 다루지 않습니다.The use of user scripts is not covered in this guide.

V8는 이전 버전의 Android SDK를 대상으로 하는 앱에 대 한 내장 Renderscript API를 지원 합니다.The Xamarin.Android V8 Support Library backports the instrinsic Renderscript API's for apps that target older versions of the Android SDK. 이 패키지를 Xamarin.ios 프로젝트에 추가 하면 이전 버전의 Android SDK를 대상으로 하는 앱이 내장 스크립트를 활용 하도록 허용 해야 합니다.Adding this package to a Xamarin.Android project should allow apps that target older versions of the Android SDK to leverage the intrinsic scripts.

Xamarin.ios에서 내장 Renderscripts 사용Using Intrinsic Renderscripts in Xamarin.Android

내장 스크립트는 최소한의 추가 코드를 사용 하 여 집약적 컴퓨팅 작업을 수행할 수 있는 좋은 방법입니다.The intrinsic scripts are a great way to perform intensive computing tasks with a minimal amount of additional code. 이러한 항목은 장치에 대 한 다양 한 측면에서 최적의 성능을 제공 하도록 조정 되었습니다.They have been hand tuned to offer optimal performance on a large cross section of devices. 내장 스크립트는 관리 코드 보다 더 빠르게 실행 되 고, 사용자 지정 C 구현 이후 2 배 10 배 실행 되는 경우가 드뭅니다.It is not uncommon for an intrinsic script to run 10x faster than managed code and 2-3x times after than a custom C implementation. 대부분의 일반적인 처리 시나리오는 내장 스크립트에 포함 됩니다.Many of the typical processing scenarios are covered by the intrinsic scripts. 이 내장 스크립트 목록은 Xamarin.ios의 현재 스크립트에 대해 설명 합니다.This list of the intrinsic scripts describes the current scripts in Xamarin.Android:

각 내장 스크립트에 대 한 자세한 내용은 API 설명서를 참조 하세요.Please consult the API documentation for details on each of the intrinsic scripts.

Android 응용 프로그램에서 Renderscript를 사용 하는 기본 단계는 다음에 설명 되어 있습니다.The basic steps for using Renderscript in an Android application are described next.

RenderscriptRenderscript 컨텍스트를 만듭니다 .Create a Renderscript Context – The Renderscript 클래스는 Renderscript 컨텍스트를 중심으로 관리 되는 래퍼로 초기화, 리소스 관리 및 정리를 제어 합니다.class is a managed wrapper around the Renderscript context and will control initialization, resource management, and clean up. Renderscript 개체는 Android 컨텍스트 (예: 활동)를 매개 변수로 사용 하는 RenderScript.Create factory 메서드를 사용 하 여 생성 됩니다.The Renderscript object is created using the RenderScript.Create factory method, which takes an Android Context (such as an Activity) as a parameter. 다음 코드 줄에서는 Renderscript 컨텍스트를 초기화 하는 방법을 보여 줍니다.The following line of code demonstrates how to initialize the Renderscript context:

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

할당 –를 만듭니다. 내장 스크립트에 따라 하나 또는 두 개의 Allocation를 만들어야 할 수 있습니다.Create Allocations – Depending on the intrinsic script, it may be necessary to create one or two Allocations. Android.Renderscripts.AllocationThe Android.Renderscripts.Allocation 클래스에는 내장 함수에 대 한 할당을 인스턴스화하는 데 도움이 되는 몇 가지 팩터리 메서드가 있습니다.class has several factory methods to help with instantiating an allocation for an intrinsic. 예를 들어 다음 코드 조각은 비트맵에 대 한 할당을 만드는 방법을 보여 줍니다.As an example, the following code snippet demonstrates how to create Allocation for Bitmaps.

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

스크립트의 출력 데이터를 저장 하는 Allocation를 만들어야 하는 경우가 많습니다.Often, it will be necessary to create an Allocation to hold the output data of a script. 다음 코드 조각에서는 Allocation.CreateTyped 도우미를 사용 하 여 원본과 동일한 형식의 두 번째 Allocation를 인스턴스화하는 방법을 보여 줍니다.This following snippet shows how to use the Allocation.CreateTyped helper to instantiate a second Allocation that the same type as the original:

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

스크립트 – 래퍼를 인스턴스화합니다 . 각 내장 스크립트 래퍼 클래스에는 해당 스크립트에 대 한 래퍼 개체를 인스턴스화하기 위한 도우미 메서드 (일반적으로 Create이라고 함)가 있어야 합니다.Instantiate the Script wrapper – Each of the intrinsic script wrapper classes should have helper methods (typically called Create)for instantiating a wrapper object for that script. 다음 코드 조각은 ScriptIntrinsicBlur 흐림 개체를 인스턴스화하는 방법의 예입니다.The following code snippet is an example of how to instantiate a ScriptIntrinsicBlur blur object. Element.U8_4 도우미 메서드는 8 비트 부호 없는 정수 값의 4 필드인 데이터 형식을 설명 하는 요소를 만들고 Bitmap 개체의 데이터를 저장 하는 데 적합 합니다.The Element.U8_4 helper method will create an Element that describes a data type that is 4 fields of 8-bit, unsigned integer values, suitable for holding the data of a Bitmap object:

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

할당 할당, 매개 변수 설정 & 스크립트 실행Script 클래스가 renderscript를 실제로 실행 하는 ForEach 메서드를 제공 합니다.Assign Allocation(s), Set Parameters, & Run Script – The Script class provides a ForEach method to actually run the Renderscript. 이 메서드는 입력 데이터를 보유 하는 Allocation의 각 Element를 반복 합니다.This method will iterate over each Element in the Allocation holding the input data. 경우에 따라 출력을 보유 하는 Allocation를 제공 해야 할 수도 있습니다.In some cases, it may be necessary to provide an Allocation that holds the output. ForEach는 출력 할당의 내용을 덮어씁니다.ForEach will overwrite the contents of the output Allocation. 이전 단계에서 코드 조각을 사용 하기 위해이 예제에서는 입력 할당을 할당 하 고, 매개 변수를 설정한 다음, 마지막으로 스크립트를 실행 하 여 결과를 출력 할당으로 복사 하는 방법을 보여 줍니다.To carry on with the code snippets from the previous steps, this example shows how to assign an input Allocation, set a parameter, and then finally run the script (copying the results to the output Allocation):

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

Renderscript 조리법에서 이미지 흐림 효과 를 체크 아웃할 수 있습니다. xamarin.ios에서 내장 스크립트를 사용 하는 방법의 전체 예제입니다.You may wish to check out the Blur an Image with Renderscript recipe, it is a complete example of how to use an intrinsic script in Xamarin.Android.

요약Summary

이 가이드에서는 Renderscript 응용 프로그램에서 사용 하는 방법 및 Renderscript를 소개 했습니다.This guide introduced Renderscript and how to use it in a Xamarin.Android application. Renderscript의 정의와 Android 응용 프로그램에서 작동 하는 방식에 대해 간략하게 설명 합니다.It briefly discussed what Renderscript is and how it works in an Android application. Renderscript의 몇 가지 주요 구성 요소와 사용자 스크립트 와 _내장 스크립트_의 차이점에 대해 설명 했습니다.It described some of the key components in Renderscript and the difference between user scripts and instrinsic scripts. 마지막으로,이 가이드에서는 Xamarin Android 응용 프로그램에서 내장 스크립트를 사용 하는 단계에 대해 설명 했습니다.Finally, this guide discussed the steps in using an intrinsic script in a Xamarin.Android application.