首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何动态创建FloatBuffer

如何动态创建FloatBuffer
EN

Stack Overflow用户
提问于 2012-08-07 17:08:04
回答 2查看 3.8K关注 0票数 5

我需要从一组动态的浮点数创建FloatBuffer(也就是说,我不知道提前的长度)。我发现做这件事的唯一方法是相当不优雅(见下文)。我想我遗漏了一些东西,一定有一个更干净/更简单的方法。

我的解决方案是:

代码语言:javascript
复制
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不仅仅是一个临时空间)。

EN

回答 2

Stack Overflow用户

发布于 2012-11-06 04:33:38

如果您通过OpenGL使用LWJGL,那么我假设您使用LWJGL作为中间人。如果是这样,有一个简单的解决方案,那就是使用org.lwjgl包中的BufferUtils类。BufferUtils.createFloatBuffer()方法允许您从array放入floats,如果您使用的是Vector,这是一个简单的转换。尽管它并不比你的方法好多少,但它确实省去了对字节缓冲区的需要,这已经够糟糕的了,并允许进行一些快速转换。此操作的代码位于OpenGL 3.2+ here的新LWJGL中。

希望这能有所帮助。

票数 5
EN

Stack Overflow用户

发布于 2012-08-07 17:29:16

我将使用一个普通的ByteBuffer,并在缓冲区填满时写出数据。(或者做任何你打算做的事情)

例如:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11842645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档