2012-05-22 106 views
38

我已经用我的Android代码FloatBuffers已有一段时间(从一些opengles教程复制),但我不明白到底是什么,这种结构是,为什么它是需要的。为什么使用FloatBuffer而不是float []?

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

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 

这似乎非常繁琐,杂乱的东西,这是据我可以告诉只是看中包裹着一系列浮游物。

问题:

  • ,这是什么类型的类(字节缓冲区,FloatBuffer)的理由,而不是任何其他类型的集合或浮标阵列简单的?

  • 背后有什么它转换成FloatBuffer之前创建字节缓冲区的想法?

回答

39

的主要原因是性能:的ByteBuffers并与本机代码接口时其他NIO类使加速操作(通常通过避免需要将数据复制到一个临时缓冲器)。

此,如果你做了很多的OpenGL渲染例如电话是非常重要的。

原因首先创建字节缓冲区的是,你要使用的allocateDirect调用创建一个直接字节的缓冲区,从加速操作中受益。然后你从这个共享相同的内存创建一个FloatBuffer。该FloatBuffer本身没有出于某种原因,这就是为什么你必须通过字节缓冲区去的allocateDirect方法。

10

我们尽我们的Java代码在Android,但OpenGL ES的底层实现实际上是用C语言编写之前,我们通过我们的数据到OpenGL,我们需要将其转换成一种形式,它会明白。 Java和原生系统可能不是他们的字节存储在相同的顺序,所以我们用一组特殊的缓冲区类,并创建一个字节缓冲区大到足以容纳我们的数据,并告诉它使用本地字节顺序来存储数据。然后我们将它转​​换为FloatBuffer,以便我们可以使用它来保存浮点数据。最后,我们将数组复制到缓冲区中。

相关问题