本文譯自:http://developer.android.com/guide/topics/renderscript/compute.html#creating-renderscript
渲染指令碼(Renderscript)提供用C語言(C99標準)編寫的原生級高效能的計算API。Renderscript讓你的應用程式有能力跨越所有可用的處理器核心來自動的平行的運行各種操作。它還提供了對不同類型的處理的支援,如CPU、GPU或DSP等。Renderscript對於圖形處理、數學模型或其他任何需要大量的數學計算的應用程式都使用有用的。
另外,不需要編寫代碼你就能夠訪問所有這些功能來支援不同的架構或不同數量的處理器核心。也不需要針對不同的處理器類型來編譯你的應用程式,因為Renderscript代碼是在裝置上運行時被編譯的。
注意:早期的Renderscript版本包含了一個實驗性的圖形引擎組件。這個組件限制被Android4.1棄用了(rs_graphics.rsh中的大多數API和android.renderscript中對應的API)。如果你有使用Renderscript來渲染圖形的應用程式,強烈推薦你把代碼轉換到另外的Android圖形渲染選項。
Renderscript系統概述
Renderscript運行時的操作是原生層級的,並且依然需要跟Android的虛擬機器(VM)進行通訊,因此建立一個Renderscript應用程式的方法不同於純粹的虛擬機器應用程式。除了你為程式編寫的所需要的Renderscript代碼之外,使用Renderscript的應用程式依然是一個運行在虛擬機器(VM)中的應用程式,不管你使用它做什麼,Renderscript依然保留它的平台獨立性,因此不必編寫多架構(例如:ARM
v5、ARM v7、x86)的Renderscript代碼。
Renderscript系統採用了一個控制和從屬的架構,在這個架構中低層級的Renderscript運行時代碼是由運行在虛擬機器(VM)中進階別的Android來控制的。Android VM依然保留所有的對記憶體管理和分配給Renderscript運行時的綁定記憶體的控制,因此Renderscript的代碼能夠訪問它。Android架構使用非同步方式調用Renderscript,並且調用會被放到訊息佇列中,直到它被處理。圖1顯示了Renderscript系統的結構:
圖1.Renderscript系統概要
在使用Renderscript時,在Renderscript運行時和Android架構代碼之間有三個層次來確保API的通訊:
1. Renderscript運行時API,它允許執行應用程式所需要的計算。
2. 反射層API是一組從Renderscript運行代碼中反射出來的類。它是圍繞Renderscript代碼的一個基本的封裝,這個封裝允許Android架構和Renderscript運行時進行互動。Android編譯工具在編譯期間會自動的產生這個層次的類。這些類跟NDK代碼一樣不需要編寫JNI代碼。
3. Android架構層,它調用反射層來訪問Renderscript運行時。
Renderscript的這種結構的主要優點是:
1. 便捷性:Renderscript被設計層可運行在不同處理器(CPU、GPU和DSP的執行個體)架構的很多裝置上。它所支援的所有這些架構,都不是針對每個特定裝置的,因為它的代碼會在運行時在裝置上被編譯和緩衝。
2. 高效性:Renderscript通過跨越裝置上的過個核心,用並行的方式,提供了高效能的計算API。
3. 易用性:Renderscript在可能的情況下,簡化了開發,如取消了JNI代碼。
主要缺點是:
1. 開發的複雜性:Renderscript引入了一組新的需要你學習的API;
2. 調試的可見度:Renderscript可能在主CPU以外的處理器(如GPU)上執行(後續的發布計劃中),因此如果發生這種事情,調試會變的更加困難。
有關這些層次是如何在一起工作的,
請看“進階Renderscript”(http://developer.android.com/guide/topics/renderscript/advanced.html)