2016-07-13 176 views
0

美好的一天我的朋友,Android/OpenglES2/examples:爲什麼要使用ByteBuffer進行座標?

我是新來的Android和Java一般,所以對於noob問題感到抱歉。 我遇到了標準的OpenGL ES的例子,並試圖理解這個代碼:

static float wallCoords[] = { 
     // in counterclockwise order: 
     -0.5f, 0.6f, 0.0f, // top left 
     -0.5f, 0.5f, 0.0f, // bottom left 
     0.5f, 0.5f, 0.0f, // bottom right 
     0.5f, 0.6f, 0.0f, // top right 
}; 
private final int vertexCount = wallCoords.length/COORDS_PER_VERTEX; 
private final int vertexStride = COORDS_PER_VERTEX * 4; // 4 bytes per vertex 

float color[] = { 0.63671875f, 0.76953125f, 0.22265625f, 0.0f }; 

private final FloatBuffer vertexBuffer; 
private final ShortBuffer drawListBuffer; 
private final short drawOrder[] = { 0, 1, 2, 0, 2, 3 }; // order to draw vertices 

... 

ByteBuffer bb = ByteBuffer.allocateDirect(
     // (number of coordinate values * 4 bytes per float) 
      wallCoords.length * 4); 
// use the device hardware's native byte order 
bb.order(ByteOrder.nativeOrder()); 
// create a floating point buffer from the ByteBuffer 
vertexBuffer = bb.asFloatBuffer(); 
// add the coordinates to the FloatBuffer 
vertexBuffer.put(wallCoords); 
// set the buffer to read the first coordinate 
vertexBuffer.position(0); 

所以我的問題是,爲什麼不使用例如FloatBuffer.wrap()方法:

vertexBuffer = FloatBuffer.wrap(wallCoords); 

謝謝!

回答

0

這是出於性能原因。

FloatBuffer不具有allocateDirect方法分配direct buffer

直接與非直接緩衝區

字節緩衝區是直接或者非直接。給定一個直接的字節緩衝區,Java虛擬機將盡最大努力直接對它執行本地I/O操作。也就是說,它將嘗試避免在每次調用某個底層操作系統的本地I/O操作之前(或之後)將緩衝區內容複製到(或從)中間緩衝區。

可以通過調用此類的allocateDirect工廠方法來創建直接字節緩衝區。這種方法返回的緩衝區通常比非直接緩衝區有更高的分配和釋放成本。

實際上FloatBuffer.wrap強烈爲結陣列和

新緩衝區將由給定的float數組支持該緩衝器中;也就是說,修改緩衝區將導致數組被修改,反之亦然。

以可能複製數據爲代價。

+0

是的,正確:)只是發現了這個解釋。然而,這並不能解釋爲什麼沒有舒適的API。無論如何,緩衝區和數組在這種情況下非常緊密(坦率地說,在Android中它總是如此)。 –