为什么使用FloatBuffer而不是float ?
我一直在我的Android代码中使用FloatBuffers一段时间(从一些opengles教程复制它),但我不能确切地理解这个结构是什么以及为什么需要它。
例如我在很多人的代码和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
这似乎是非常冗长和杂乱的东西,据我所知只是一个漂浮的花车包装周围的花车。
问题:
-
什么是这种types(ByteBuffer,FloatBuffer)types的理由,而不是任何其他types的集合或简单的浮点数组?
-
在将其转换为FloatBuffer之前创build一个ByteBuffer的想法是什么?
主要原因是性能:ByteBuffers和其他NIO类在与本地代码接口时(通常避免将数据复制到临时缓冲区)启用加速操作。
例如,如果您正在进行大量的OpenGL渲染调用,这非常重要。
首先创buildByteBuffer的原因是,您希望使用allocateDirect调用来创build直接字节缓冲区,这受益于加速操作。 然后你从这个共享相同的内存创build一个FloatBuffer。 由于某些原因,FloatBuffer本身没有allocateDirect方法,这就是为什么你必须通过ByteBuffer。
我们在Android上使用Java进行编码,但OpenGL ES的底层实现实际上是用C语言编写的。在将数据传递给OpenGL之前,我们需要将其转换为它将要理解的forms。 Java和本机系统可能不会以相同的顺序存储它们的字节,所以我们使用一组特殊的缓冲区类,并创build一个足够大的ByteBuffer来保存我们的数据,并告诉它使用本地字节顺序来存储它的数据。 然后我们将它转换成一个FloatBuffer,以便我们可以使用它来保存浮点数据。 最后,我们将数组复制到缓冲区中。