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 使用 OpenGL API,我假设您使用 LWJGL 作为中间人。如果是这样,有一个简单的解决方案,即使用BufferUtilsorg.lwjgl 包中的类。该方法BufferUtils.createFloatBuffer()允许您从 a 中放入floats array,如果您使用的是 a Vector,则这是一个简单的转换。虽然它并不比你的方法好多少,但它确实节省了对字节缓冲区的需要,这已经够讨厌了,并且允许进行一些快速转换。此处的 OpenGL 3.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。

于 2012-08-07T09:29:16.030 回答