2012-05-27 146 views
1

我學習的OpenGL ES的Android通過這個網站:http://www.learnopengles.com/android-lesson-one-getting-started/的OpenGL ES的Android混亂

有一對夫婦的事情,我不明白...

究竟做這個代碼做:

mTriangle1Vertices = ByteBuffer.allocateDirect(triangle1VerticesData.length * mBytesPerFloat) 
    .order(ByteOrder.nativeOrder()).asFloatBuffer(); 
    mTriangle2Vertices = ByteBuffer.allocateDirect(triangle2VerticesData.length * mBytesPerFloat) 
    .order(ByteOrder.nativeOrder()).asFloatBuffer(); 
    mTriangle3Vertices = ByteBuffer.allocateDirect(triangle3VerticesData.length * mBytesPerFloat) 
    .order(ByteOrder.nativeOrder()).asFloatBuffer(); 

    mTriangle1Vertices.put(triangle1VerticesData).position(0); 
    mTriangle2Vertices.put(triangle2VerticesData).position(0); 
    mTriangle3Vertices.put(triangle3VerticesData).position(0); 

什麼是這些「緩衝區」的東西,並總是有四個字節浮動?我不確定爲什麼需要上面的代碼。作者解釋說,但我不確定他的意思。

謝謝!

+0

最近我問了一個類似的問題,也許有一個答案可能對你有用:http://stackoverflow.com/questions/10697161/why-floatbuffer-instead-of-float – Tim

+0

嘿,我也在學習通過這些關於「學習Open GL ES」的精彩教程。第7課討論頂點緩衝區對象的可移植使用和硬件加速。 –

回答

2

爲什麼我們甚至需要這樣做呢?

如果我們用C編寫代碼,我們不需要上面的代碼 - 我們只需要跳過整個ByteBuffer.allocateDirect的東西,並在我們調用drawArrays或drawElements時傳遞一個指向數組的指針。然而,我們不能這麼做,因爲Dalvik是Android內運行的Java虛擬機,它有一個垃圾收集器,它可能會將數據移到我們身邊。它甚至可能會廢棄記憶,錯誤地認爲我們不再需要它了。安全的方法是使用ByteBuffer.allocateDirect在本機內存中創建一塊內存,將數據複製到該內存,然後OpenGL可以直接使用它,而不必擔心虛擬機。

每個緩衝區都需要足夠大以容納我們要複製的數據;當我們創建緩衝區時,它需要以字節爲單位的大小。我們的Java數組由浮點數組成,因此要計算出字節的大小,我們傳遞數組長度並將其乘以4.浮點值是32位,而字節是8位值,所以在那裏總是4個字節的浮點數。

希望這會有所幫助。 :)