50

私はAndroidコードでFloatBuffersをしばらく使用しています(いくつかのopenglesチュートリアルからコピーしたものです)が、この構成が何であるか、なぜそれが必要なのかを正確に理解できません。

たとえば、このコード(または同様のコード)は、多くの人々のコードやAndroidチュートリアルで見られます。

float[] vertices = ...some array...

ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4); 
vbb.order(ByteOrder.nativeOrder());    // use the device hardware's native byte order
FloatBuffer fb = vbb.asFloatBuffer();  // create a floating point buffer from the ByteBuffer
fb.put(vertices);    // add the coordinates to the FloatBuffer
fb.position(0);      // set the buffer to read the first coordinate

これは、私が知る限り、フロートの配列の単なる派手なラッパーである何かにとって、ひどく冗長で厄介なようです。

質問:

  • 他の種類のコレクションやfloatの単純な配列とは対照的に、このタイプのクラス(ByteBuffer、FloatBuffer)の正当性は何ですか?

  • FloatBufferに変換する前にByteBufferを作成する背後にある考え方は何ですか?

4

2 に答える 2

46

主な理由はパフォーマンスです。ByteBuffersおよびその他のNIOクラスは、ネイティブコードとのインターフェイス時に(通常、データを一時バッファーにコピーする必要性を回避することにより)高速化された操作を可能にします。

たとえば、多くのOpenGLレンダリング呼び出しを行う場合、これは非常に重要です。

最初にByteBufferを作成する理由は、allocateDirect呼び出しを使用して直接バイトバッファーを作成するためです。これは、高速化された操作の恩恵を受けます。次に、これから同じメモリを共有するFloatBufferを作成します。FloatBuffer自体には、何らかの理由でallocateDirectメソッドがありません。そのため、ByteBufferを経由する必要があります。

于 2012-05-22T06:59:09.960 に答える
14

Android上のJavaでコーディングを行いますが、OpenGL ESの基本的な実装は実際にはCで記述されています。データをOpenGLに渡す前に、データを理解できる形式に変換する必要があります。Javaとネイティブシステムはバイトを同じ順序で格納しない可能性があるため、特別なバッファクラスのセットを使用して、データを保持するのに十分な大きさのByteBufferを作成し、ネイティブのバイト順序を使用してデータを格納するように指示します。次に、それをFloatBufferに変換して、浮動小数点データを保持するために使用できるようにします。最後に、配列をバッファにコピーします。

于 2012-08-24T09:38:29.450 に答える