首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么是FloatBuffer而不是float[]?

为什么是FloatBuffer而不是float[]?
EN

Stack Overflow用户
提问于 2012-05-22 06:53:25
回答 2查看 21.2K关注 0票数 50

我已经在我的Android代码中使用了FloatBuffers一段时间(从一些opengles教程中复制),但是我不知道这个构造是什么以及为什么需要它。

例如,我在许多人的代码和android教程中看到了这段代码(或类似的代码):

代码语言:javascript
复制
float[] vertices = ...some array...

ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4); 
vbb.order(ByteOrder.nativeOrder());    // use the device hardware's native byte order
FloatBuffer fb = vbb.asFloatBuffer();  // create a floating point buffer from the ByteBuffer
fb.put(vertices);    // add the coordinates to the FloatBuffer
fb.position(0);      // set the buffer to read the first coordinate

就我所知,这似乎非常冗长和混乱,只是一个花花公子的包装。

问题:

  • 这种类( ByteBuffer,FloatBuffer)的理由是什么,而不是其他类型的集合或简单的浮点数数组?
  • ,在将其转换为FloatBuffer?

之前,创建ByteBuffer的想法是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-22 06:59:09

主要原因是性能: ByteBuffers和其他NIO类在与本机代码接口时启用加速操作(通常避免将数据复制到临时缓冲区)。

例如,如果您正在执行大量OpenGL呈现调用,这是非常重要的。

首先创建一个ByteBuffer的原因是您希望使用allocateDirect调用来创建一个直接字节缓冲区,这将从加速的操作中获益。然后创建一个共享相同内存的FloatBuffer。由于某些原因,FloatBuffer本身没有allocateDirect方法,这就是为什么您必须通过ByteBuffer。

票数 46
EN

Stack Overflow用户

发布于 2012-08-24 09:38:29

我们在Android上用Java编写代码,但是OpenGL ES的底层实现实际上是用C编写的。在我们将数据传递给OpenGL之前,我们需要将其转换成它将要理解的形式。Java和本机系统可能不会按照相同的顺序存储它们的字节,因此我们使用一组特殊的缓冲区类,并创建一个足以容纳数据的ByteBuffer,并告诉它使用本机字节顺序存储其数据。然后,我们将其转换为一个FloatBuffer,以便我们可以使用它来保存浮点数据。最后,我们将数组复制到缓冲区中。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10697161

复制
相关文章

相似问题

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