1

I am learning OpenGL ES for Android through this website: http://www.learnopengles.com/android-lesson-one-getting-started/

There are a couple of things I don't understand...

What exactly do this code do:

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);

What are these "buffer" things and are there always four bytes to a float? I'm not really sure why the code above is needed. The author explained it, but I'm not sure what he means.

Thanks!

4

1 に答える 1

2

なぜこれを行う必要があるのでしょうか。

C でコーディングしている場合、上記のコードは必要ありません。つまり、ByteBuffer.allocateDirect 全体をスキップして、drawArrays または drawElements を呼び出すときに配列へのポインターを渡すだけです。ただし、Android 内で実行されている Java 仮想マシンである Dalvik にはガベージ コレクターがあり、それによってデータが移動される可能性があるため、これを行うことはできません。もう必要ないと誤って考えて、記憶を廃棄することさえあるかもしれません。これを行う安全な方法は、ByteBuffer.allocateDirect を使用してネイティブ メモリにメモリ ブロックを作成し、そこにデータをコピーすることです。その後、仮想マシンを気にすることなく、OpenGL がそれを直接使用できます。

各バッファーは、コピーするデータを保持するのに十分な大きさである必要があります。バッファを作成するとき、バイト単位のサイズが必要です。Java 配列は浮動小数点数で構成されているため、サイズをバイト単位で計算するには、配列の長さを渡して 4 を掛けます。浮動小数点値は 32 ビットで、バイトは 8 ビット値です。 float に対して常に 4 バイトです。

これが役立つことを願っています。:)

于 2012-06-06T02:31:48.637 に答える