2013-06-21 27 views
0

在Android中涉及OGLES。我想創建一些三角形並翻譯它們。直截了當。翻譯 - GLES translateM() - android中的floatbuffer

我看看這些例子,並且看到FloatBuffers被推薦爲在Android中使用GLES的多邊形座標的存儲結構,因爲它們使用本地代碼類固體。好東西!這裏解釋。

Why FloatBuffer instead of float[]?

現在有什麼困惑,我是在Android的Matrix類幾乎完全運行在Java的浮點數組。所以一方面我被告知要使用FloatBuffers來提高速度,但另一方面,我現在要做的每個轉換都必須是這樣的?

float[] myJavaFloatArray = new float[polylength]; 
myFloatBuffer.get(myJavaFloatArray); 
Matrix.translateM(myJavaFloatArray,0,-1.0f,0.0f,0.0f); 
myFloatBuffer.put(myJavaFloatArray); 

這真的是最佳做法嗎?假設我的翻譯比率是否足夠低以至於這筆費用是值得的?如果我正在做大量的翻譯,每幀每個對象上有一個,那麼在整個過程中使用java浮點數組的參數呢?

回答

1

首先,是不是有一種方法array()FloatBuffer返回float[]值直接指向緩衝區數據?你應該用在翻譯方法,這樣你就不會將數據複製解決內存,這應該把你的4行代碼寫成一行:

Matrix.translateM(myFloatBuffer.array(),0,-1.0f,0.0f,0.0f); 

其次,它是不是最好的做法,改變你的頂點數據在CPU上,你有一個頂點着色器。使用矩陣並將它們推送到GPU,以便從中受益。此外,如果您按照這種方式轉換這些數據,那麼您會損壞它們:如果浮點緩衝區包含要在多個位置繪製的某個對象的頂點數組,則必須將它翻譯爲0,然後再將其轉換爲新位置對於每個繪圖調用或具有頂點數據的多個實例。

無論如何,儘管能夠轉換數組緩衝區非常方便,但如果可能的話,應避免每幀使用它。準備某些元素時,請在加載時間或後臺執行此操作。至於每幀,而是嘗試使用頂點着色器。如果你正在處理ES1並且你沒有頂點着色器,仍然有矩陣操作以相同的方式工作(平移,旋轉,縮放,設置,推動,彈出...)

+0

感謝您的回答。 array()方法應該完全按照你所說的做,但在我的設備上拋出錯誤。結果不能保證該方法在目標上實現。這就是說,當我回家時,我會嘗試着色器的第一件事! –