我需要从一组动态浮点数创建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不仅仅是一个临时空间)。
答案 0 :(得分:4)
如果您通过Java使用OpenGL API,我假设您使用LWJGL作为中间人。如果是这样,有一个简单的解决方案,即使用org.lwjgl包中的BufferUtils
类。方法BufferUtils.createFloatBuffer()
允许您从float
中加入array
,如果您使用的是Vector
,则是一个简单的转换。虽然它并不比你的方法好多少,但它确实需要一个足够令人讨厌的字节缓冲区,并允许一些快速转换。这个代码存在于OpenGL 3.2 + here的新LWJGL教程中。
希望这有帮助。
答案 1 :(得分:1)
我会使用普通的ByteBuffer,当缓冲区填满时我会写出数据。 (或做任何你计划用它做的事情)
e.g。
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。