Android API Guides---RenderScript
RenderScript
RenderScript是在Android上的高性能執行計算密集型任務的框架。
RenderScript主要面向與數據并行計算的使用。盡管串行計算密集型工作負載能夠受益。該RenderScript執行時將并行工作過這樣的多核的CPU。GPU或DSP設備上全部可用的處理器,讓您專注于表達的算法。而不是安排工作或負載平衡。
RenderScript是用于進行圖像處理,計算攝影或計算機視覺應用特別實用。
首先RenderScript。主要有兩個概念。你應該明確:
高性能的計算內核寫入一個C99衍生的語言。
一種Java API用于管理RenderScript資源的壽命和控制內核運行。
寫一個RenderScript內核
一個RenderScript內核通常駐留在<project_root> / src文件夾/文件夾下的文件.RS;每一個.RS文件稱為一個腳本。每一個腳本包括它自己的一套內核,函數和變量。
腳本能夠包括:
編譯指示聲明(版本號的#pragma(1))聲明此腳本中使用的RenderScript內核語言的版本號。
眼下。1是唯一有效的值。
編譯指示聲明,聲明此腳本反映了Java類的包名稱(#pragma RS java_package_name(com.example.app))。請注意。您.RS文件必須在庫項目的應用程序包的一部分,而不是。
一些數量的可調用的函數。可調用的函數是一個單線程RenderScript函數,您能夠從隨意參數您的Java代碼中調用。
這些往往是一個更大的處理管道內的初始設置或串行計算實用。
有些數字腳本的全局變量。全球腳本相當于C.能夠從Java代碼中訪問腳本全局一個全局變量,而這些往往是用于傳遞到renderScript內核參數。
有些數字計算內核。內核是一個并行函數分配在整個范圍內的每個元素運行。
一個簡單的內核可能例如以下所看到的
默認情況下,內核在整個分配執行,每一個元素在分配內核體的一個執行。
第三個顯著的特點是內核的返回類型。
從內核返回的值自己主動寫入到輸出分配適當的位置。該RenderScript執行時檢查,以確保該元素類型的輸入和輸出劃分與內核的原型;假設它們不匹配,則拋出異常。
內核可能有一個輸入分配。輸出分配,或兩者兼而有之。內核可能不會有一個以上的輸入或一個輸出分配。假設須要一個以上的輸入或輸出。這些對象應綁定到rs_allocation腳本全局和經由rsGetElementAt_type()或rsSetElementAt_type()從一個內核或可調用函數進行訪問。
內核能夠訪問當前運行的使用x,y和z參數的坐標。這些參數是可選的。可是坐標參數的類型必須是uint32_t的。
可選init()函數。
一個init()函數是在腳本第一次實例化時執行可調用函數的一種特殊類型。這使得在劇本創作自己主動進行一些計算。
有些數字靜態腳本全局變量和函數。
全球靜態腳本相當于僅僅是它不能從Java代碼中設置全局的腳本。靜態函數是一個標準的C函數能夠從腳本中的不論什么內核或可調用函數被調用,但不暴露的Java API。
假設腳本全球性或功能并不須要從Java代碼中調用,強烈建議那些被聲明為static。
設置浮點精度
您能夠控制??浮點精度在腳本的要求的水平。
假設不須要完整的IEEE 754-2008標準(默認情況下使用)。這很實用。下面編譯指示能夠設置不同級別的浮點準確度:
的#pragma rs_fp_full(假設默認是沒有指定):對于須要浮點精度由IEEE 754-2008標準所列出的應用程序。
的#pragma rs_fp_relaxed - 對于不要求嚴格IEEE 754-2008合規性和可耐受精度要求不高的應用程序。這樣的模式可以為denorms沖洗到零和圓朝零。
的#pragma rs_fp_imprecise - 對于沒有嚴格的精度要求的應用程序。這樣的模式下,符合下列一起rs_fp_relaxed一切:
導致-0.0操作能夠返回+0.0取代。
在INF和NAN操作是不確定的。
大多數應用程序能夠使用rs_fp_relaxed無任??何副作用。這可能是在某些體系結構很有利。因為僅僅適用于寬松的精度(如SIMD CPU指令)額外的優化。
訪問RenderScript的API
當開發使用RenderScript一個Android應用程序,您能夠通過下面兩種方式之中的一個訪問其API:
android.renderscript - 該類包中的API可執行Android 3.0(API級別11)和更高版本號的設備。
android.support.v8.renderscript - 此包中的API可通過一個支持庫,它同意你使用它們執行Android 2.2(API 8級)和更高版本號的設備。
我們強烈建議您使用支持庫API來訪問RenderScript,由于他們提供更廣泛的設備兼容性。
假設有必要針對開發人員的Andr??oid的特定版本號能夠使用android.renderscript。
使用RenderScript支持庫API
為了使用支持庫RenderScript的API,必須將開發環境配置為可以訪問它們。以下的Andr??oid SDK工具都須要使用這些API:
Android SDK工具版本號22.2或更高版本號
Android SDK中內建工具版本號18.1.0或更高版本號
您能夠檢查和更新在Android SDK管理器這些工具的安裝版本號。
要使用支持庫RenderScript的API:
請確保您有所需的Andr??oid SDK版本號和構建工具安裝的版本號。
更新為Android構建過程包含RenderScript設置的設置:
為Android Studio或搖籃基于構建
在應用程序模塊的應用程序目錄中打開的build.gradle文件。
加入下面RenderScript設置到文件里:
renderscriptTargetApi - 指定要產生的字節碼的版本號。我們建議您將此值設置為renderscriptSupportModeEnabled真可用的最高API級別和集。此設置的有效值為11的隨意整數到近期公布的API級別。假設您的應用程序清單中指定的最低SDK版本號設置為不同的值。該值被忽略,在生成文件里的目標值是用來設置的最低SDK版本號。
renderscriptSupportModeEnabled - 指定生成的字節碼應該回落到一個兼容的版本號,假設它執行的設備不支持目標版本號。
buildToolsVersion - 的Andr??oid SDK的構建工具版本號使用。
此值應設置為18.1.0或更高。假設未指定此選項。則使用已安裝的最高版本號的工具版本號。
你應該總是將該值設置為確保構建跨越發展的機器不同配置的一致性。
對于Eclipse
在應用程序項目的根目錄中打開project.properties文件。
加入下面行到文件里:
renderscript.target - 指定要產生的字節碼的版本號。
我們建議您將此值設置為可用的最高API級別,并設置renderscript.support.mode為true。此設置的有效值為11的隨意整數到近期公布的API級別。假設您的應用程序清單中指定的最低SDK版本號設置為較高的值,這個值被忽略。目標值設置為最小SDK版本號。
renderscript.support.mode - 指定生成的字節碼應該回落到一個兼容的版本號,假設它執行的設備不支持目標版本號。
sdk.buildtools - Android SDK的版本號構建工具來使用。此值應設置為18.1.0或更高。假設未指定此選項。則使用已安裝的最高版本號的工具版本號。
你應該總是將該值設置為確保構建跨越發展的機器不同配置的一致性。
在使用RenderScript您的應用程序類,加入一個導入的支持庫類:
從Java代碼中使用RenderScript依賴于位于android.renderscript或android.support.v8.renderscript包中的API類。大多數應用程序都遵循同樣的基本使用模式:
初始化RenderScript上下文。的RenderScript上下文,以創建(上下文)創建的,確保了RenderScript能夠使用,并提供一個目的是控制全部興許RenderScript對象的生存期。你應該考慮上下文創建是一個潛在的長期執行的操作,由于它能夠創建不同的硬件資源;它不應該是在應用程序的關鍵路徑,假設在全部可能的。通常。應用程序將具有僅在一個單一的時間RenderScript上下文。
創建至少一個分配要傳遞到的腳本。一個分配是一個RenderScript對象。對于數據的固定量提供存儲。
在腳本中的內核採取分配對象作為它們的輸入和輸出,并分配對象能夠在內核使用rsGetElementAt_type()和rsSetElementAt_type()時作為腳本全局約束訪問。分配對象同意陣列從Java代碼傳遞到renderScript代碼,反之亦然。
分配對象使用createTyped(RenderScript。類型)或createFromBitmap(RenderScript。位圖)通常創建。
創建不論什么腳本是必要的。
有使用RenderScript時,兩種類型的提供給你的腳本:
ScriptC:這些是在寫RenderScript內核上述用戶定義腳本。
每一個腳本都有了RenderScript編譯器,以使其易于訪問從Java代碼腳本反映了一個Java類;這個類將命名ScriptC_filename。比如,假設內核上面位于invert.rs和一個RenderScript上下文已經位于MRS。Java代碼以實例化腳本將是:
欲了解很多其它信息。請參閱ScriptIntrinsic的子類。
用數據填充分配。除了與android.renderscript創建分配,分配將與空數據填充第一次創建時。要填充的分配,使用分配的復制方法之中的一個。
設置不論什么必要的腳本全局變量。全局可使用在同一ScriptC_filename類與名為set_globalname方法的方法進行設置。
比如。為了設置一個int命名元素,使用Java方法set_elements(INT)。 RenderScript對象也能夠在內核集;比如。命名為查找rs_allocation變量能夠與方法set_lookup(分配)來設置。
推出對應的內核。
方法推出一個給定的內核將反映在同一ScriptC_filename類命名的方法的forEach內核名稱()。
這些發射是異步的。并啟動將在它們推出的順序進行序列化。依據不同的參數傳遞給內核。該方法將採取一個或兩個分配。默認情況下,內核將運行整個輸入或輸出的分配;運行過該分配的一個子集,通過適當Script.LaunchOptions作為最后一個參數傳遞給ForEach方法。
調用的功能能夠用反映在同一ScriptC_filename類invoke_functionname方法推出。
復制出的數據分配對象。為了從Java代碼分配訪問數據。這些數據必須被復制回用分配的復制方法之中的一個的Java緩沖區。這些功能將與異步同步內核和功能的推出是必要的。
拆掉RenderScript上下文。
該RenderScript上下文能夠用destroy()方法,或通過同意垃圾收集RenderScript上下文對象被銷毀。這將導致不論什么進一步使用屬于這方面的不論什么對象的拋出異常。
總結
以上是生活随笔為你收集整理的Android API Guides---RenderScript的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux7.3安装oracle12c
- 下一篇: android sina oauth2.