2016-07-13 2 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

direct bufferを割り当て allocateDirect方法を持っていません。ダイレクトバイトバッファーが与えられると、Java仮想マシンは直接ネイティブI/O操作を実行するために最善の努力をします。つまり、基礎となるオペレーティングシステムのネイティブI/O操作のいずれかを呼び出す前に、中間バッファにバッファの内容をコピーすることを避けようとします。

ダイレクトバイトバッファは、このクラスのallocateDirectファクトリメソッドを呼び出すことで作成できます。このメソッドによって返されるバッファは、通常、非ダイレクトバッファよりも割り当てや解放のコストが幾分高くなります。実際に

FloatBuffer.wrap強くアレイおよびバッファ

新しいバッファが所与のfloat配列によって補助されますを結び付けます。つまり、バッファを変更すると配列が変更され、その逆もあります。

データをコピーする可能性があります。

+0

はい、正解:この説明が見つかりました。しかし、これは快適なAPIがないことを説明していません。とにかく、この状況ではバッファと配列は強く結びついています(そして率直に言って、Androidでは常にそうです)。 –

関連する問題