編輯:關於Android編程
指針
指針被反射到位於<project_root>/gen/package/name/ScriptC_renderscript_filename的腳本類中。你能夠給給結構體或其他任何Renderscript支持的類型聲明指針,但是結構體不能夠包含指針或嵌套數組。例如,如果你聲明了下列的指向struct和int32_t的指針:
typedef struct Point {
float2 position;
float size;
} Point_t;
Point_t *touchPoints;
int32_t *intPointer;
那麼就會有以下代碼生成:
privateScriptField_Point mExportVar_touchPoints;publicvoid bind_touchPoints(ScriptField_Point v){ mExportVar_touchPoints = v; if(v ==null) bindAllocation(null, mExportVarIdx_touchPoints); else bindAllocation(v.getAllocation(), mExportVarIdx_touchPoints);} publicScriptField_Point get_touchPoints(){ return mExportVar_touchPoints;} privateAllocation mExportVar_intPointer;publicvoid bind_intPointer(Allocation v){ mExportVar_intPointer = v; if(v ==null) bindAllocation(null, mExportVarIdx_intPointer); else bindAllocation(v, mExportVarIdx_intPointer);} publicAllocation get_intPointer(){ return mExportVar_intPointer;}一個get方法和一個名叫bind_pointer_name(它代替了set()方法)的特殊方法被生成。這個方法允許把Android VM中分配的內存綁定到Renderscript運行時(不能在.rs文件中分配內存)。
分配內存的API
使用Renderscript的應用程序依然運行在Android VM中。但實際上,Renderscript代碼是運行在原生系統中,並且需要訪問在Android VM中分配的內存。要達到這個目的,就必須把在VM分配的內存綁定給Renderscript運行時。這個過程被叫做綁定,它允許Renderscript運行時跟它所請求的內存進行無縫的工作,但卻不能明確的分配。最終的結果是跟C語言中調用malloc方法相同。這樣做的好處就是Android VM能夠像共享內存一樣對Renderscript運行時層進行垃圾回收。只需要對動態分配的內存進行綁定。靜態分配的內存在Renderscript代碼編譯時被自動的創建。
有一組API來支持這種內存分配系統,它們允許Android VM分配內存並提供與malloc調用類似的功能。這些類描述了內存應該如何分配,以及如何執行分配處理。為了更好的理解這些類是如何工作的,先思考一下與它們相關的malloc的簡單調用是有好處的:
array = (int*)malloc(sizeof(int)*10);
這個malloc調用能夠被分為兩部分:1.要分配的內存單元的尺寸;2要分配有多少個這樣的內存單元(10)。Android框架針對這兩部分,提供了代表malloc自己的類。
Element類代表了malloc調用的sizeof(int)部分,並且封裝了一個內存分配單元,如一個浮點值或一個一個結構體。Type類封裝了Element類和要分配的元素的數量(在上面的例子中是10)。你可以把Type類看做是一個Element類的數組。Allocation類會基於給定Type類來進行實際的內存分配,並代表了實際被分配的內存。
在大多數情況中,都不需要直接調用這些分配內存的API。反射層的類會自動的使用這些API來生成代碼,並且對於分配內存,你所需要做的所有事情就是:調用一個在反射層的一個類中所聲明的構造器,然後把分配到的內存綁定到Renderscript。有些時候,你可能想要直接使用這些類來自己進行內存分配,如從一個資源中加載一張位圖,或是想要把內存指針分配給原始數據類型。下表中更加詳細的介紹了這個三個內存管理類:
Android 對象類型
說明
Element
一個Element對象代表了一個內存分配單元,並能夠有兩種形式:基本(basic)和復合(complex)。
一個基本的Element對象包含了一個單一的有效的Renderscript數據類型的數據組件。基本元素數據類型的例子包括:float值、float4向量或一個單一的RGB-565顏色;
復合Element包含了一個基本元素的列表,並且是用在Renderscript代碼中聲明的結構體來創建的。例如一個被分配的內存能夠包含多個在內存中按順序排列的結構體。每個結構體都被認為是它的元素,而不是結構體中的數據類型。
Type
Type類是一個分配內存的模板,並且由一個元素和多個維度組成。它描述了內存的布局(基本上是一個Element對象的數組),但並不給它所描述的數據分配內存
一個由5個維度組成的Type:X,Y,Z,LOD(細節層次的),Faces(立方體的面)。在可用的內存限制內,你能夠給X,Y,Z分配任意正整數的值。分配一維的內存空間就是要讓X維度的值大於0,而Y和Z維度要等於,以示其不存在。例如,X=10,Y=1代表被分配的內存有兩個維度組成,X=10,Y=0則代表一個維度。LOD和Faces都是布爾值,用來指示其存在或不存在。
Allocation
一個Allocation會基於由Type所代表的內存描述,給應用程序提供了內存。被分配的內存能夠同時存在多個內存空間中。如果一個內存空間被修改,必須明確的同步該內存,以便在所有存在的其他內存中,只有該內存被更新。
更新分配數據的使用以下兩種主要方法之一:類型檢查和非類型檢查。對於簡單的數組,用copyFrom函數從Android系統中復制數組,並把它拷貝到原生層內存來保存。非類型檢查的變體因為它不支持結構體,所以允許Android系統來復制結構體數組。例如,如果有一個n個浮點數的數組,那麼包含在float[n]或byte[n*4]的數組中的數據能夠被復制。
EventBus是個什麼東西?有什麼用? EventBus是一個發布 / 訂閱的事件總線。簡單點說,就是兩人約定好怎麼通信,一人發布消息,另外一個約定好的人立馬接收到你發
配置Ubantu系統服務器,需要在“終端”輸入指定的命令來安裝指定的程序,進行對應的操作,類似於Windows中的命令行,因此在進行接下來的配置操
綜述 View的繪制流程可以分為三大步,它們分別是measure,layout和draw過程。measure表示View的測量過程,用於測量View的寬度和高度;lay
最近瞄到一個小項目….Yalantis/Context-Menu.Android打開這個項目,我只想看看那個動態展開的menu是怎麼實現的.忽