5

動的なフロートのセットからFloatBufferを作成する必要があります(つまり、事前に長さがわかりません)。これを行うために私が見つけた唯一の方法は、かなりエレガントではありません(以下)。私は何かが欠けていると思います、そしてよりクリーンでより簡単な方法がなければなりません。

私の解決策:

Vector<Float> temp = new Vector<Float>();
//add stuff to temp
ByteBuffer bb = ByteBuffer.allocateDirect( work.size() * 4/*sizeof(float)*/ );
bb.order( ByteOrder.nativeOrder() );
FloatBuffer floatBuf = bb.asFloatBuffer();
for( Float f : work )
    floatBuf.put( f );
floatBuf.position(0);

私はOpenGLコマンドにバッファを使用しているので、それらを保持する必要があります(つまり、結果のFloatBufferは単なる一時的なスペースではありません)。

4

2 に答える 2

5

Javaを介してOpenGLAPIを使用している場合は、仲介としてLWJGLを使用していると思います。もしそうなら、これに対する簡単な解決策があります。それBufferUtilsは、org.lwjglパッケージのクラスを使用することです。このメソッドBufferUtils.createFloatBuffer()を使用すると、floatからsを入力できarrayます。これは、を使用している場合Vectorは単純な変換です。それはあなたの方法よりもはるかに優れているわけではありませんが、それは十分に厄介なバイトバッファの必要性を節約し、いくつかの迅速な変換を可能にします。このためのコードは、OpenGL3.2以降の新しいLWJGLチュートリアルにあります

お役に立てれば。

于 2012-11-05T20:33:37.860 に答える
1

プレーンな ByteBuffer を使用し、バッファがいっぱいになったときにデータを書き出します。(または、これまでに計画していたことを実行します)

例えば

SocketChannel sc = ...
ByteBuffer bb = ByteBuffer.allocateDirect(32 * 1024).order(ByteOrder.LITTLE_ENDIAN);
for(int i = 0 ; i < 100000000; i++) {
   float f = i;
   // move to a checkFree(4) method.
   if (bb.remaining() < 4) {
       bb.flip();
       while(bb.remaining() > 0)
           sc.write(bb);
   }
   // end of method
   bb.putFloat(f);

}

非常に大きなバッファを作成すると、実際には、データを生成して処理するよりも遅くなる可能性があります。

注: これにより、ガベージはほとんど作成されません。ByteBuffer であるオブジェクトは 1 つだけです。

于 2012-08-07T09:29:16.030 に答える