因為利用Renderscript的應用程式依然運行在Android虛擬機器(VM)內部,所以能夠訪問所有你熟悉的架構API,但也可在適當的時機利用Renderscript。為了促進Renderscript運行時和架構之間的相互作用,利用中介層代碼來幫。助兩個代碼層之間的通訊和記憶體管理。本文深入討論不同代碼層的更多細節,以及Android VM和Renderscript運行時之間是共用記憶體的。
Renderscript Runtime層
Renderscript 代碼被編譯,並且在一個簡潔而明確的Runtime層被執行。Renderscript運行時API提供了對密集計算的支援,它能夠方便而自動的擴充到可用處理器核心上。
注意:NDK中標準的C函數保證要運行在CPU上,所以Renderscript不能訪問這些類庫,因為Renderscript被設計成要運行在不同類型的處理器上。
Renderscript代碼要定義在Android工程src/目錄中的*.rs和*.rsh檔案中。通過llvm編譯器Renderscript代碼被編譯成中間位元組碼,llvm編譯器是作為Android編譯的一部分來啟動並執行。當應用程式在裝置上運行時,該位元組碼會通過駐留在裝置上的另一個llvm編譯器即時的編譯成機器碼。該機器碼會針對裝置進行最佳化並被緩衝,因此後續對該Renderscript的使用不需要重新編譯該位元組碼。
Renderscript運行時類庫包括以下一些關鍵的功能:
1. 記憶體配置請求的功能;
2. 帶有標量和向量類型的數學函數庫,該函數庫是許多共同常式的重載版本。如加法運算、乘法運算、點陣運算、叉積運算以及原子計算和比較函數等都是有效;
3. 未經處理資料和向量、矩陣、日期和時間的轉換;
4. 支援Renderscript系統的資料類型和結構,如針對向量類型所定義的二維、三維、四維向量;
5. 日誌函數。
反射層
反射層是一組由Android編譯工具產生的類,使用這些類允許從Android架構中訪問Renderscript運行時。該層還提供了一些方法和構造器,它們允許使用在Renderscript代碼中定義的指標所指向的記憶體來進行記憶體配置和相關工作。下面列出了一些主要的反射組件:
1. 你建立的每個.rs檔案都會產生一個ScriptC類型的名叫project_root/gen/package/name/ScriptC_renderscript_filename的類,這個檔案是你的.rs檔案的.java版,你能夠在Android架構中調用這個類。該類包含了從.rs檔案中反射來的以下項目:
A. 非靜態函數;
B.非靜態,全域的Renderscript變數。Android編譯工具會給每個變數產生訪問器方法,以便能夠在Android架構中讀寫這些Renderscript變數。如果一個全域變數在Renderscript運行時層被初始化,那麼那些初始化的值會被用於初始化Android架構層中對應的變數。如果全域變數被標記為const,那麼就不會產生set方法。
C.全域指標www.2cto.com
一個被反射到自己類的名叫project_root/get/package/name/ScriptField_struct_name的struct,它繼承Script.FielBase類。這個代表了一個struct數組,它允許給這個struct的多個執行個體分配記憶體。
作者:FireOfStar