Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么是FloatBuffer而不是float[]?_Java_Android_Opengl Es - Fatal编程技术网

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

Java 为什么是FloatBuffer而不是float[]?,java,android,opengl-es,Java,Android,Opengl Es,我在Android代码中使用FloatBuffers已经有一段时间了(从一些opengles教程中复制了它),但我不能确切地理解这个构造是什么以及为什么需要它 例如,我在许多人的代码和android教程中看到了以下代码(或类似代码): float[] vertices = ...some array... ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4); vbb.order(ByteOrder.nativeOrd

我在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
就我所知,这似乎是一个非常冗长和混乱的东西,只是一个花式的数组包装

问题:

  • 这种类型的类(ByteBuffer、FloatBuffer)与任何其他类型的集合或简单的浮点数组相比,其合理性是什么

  • 在将ByteBuffer转换为FloatBuffer之前创建ByteBuffer背后的想法是什么


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

例如,如果要执行大量OpenGL渲染调用,这一点非常重要


首先创建ByteBuffer的原因是您希望使用allocateDirect调用创建直接字节缓冲区,这得益于加速操作。然后,您可以从该缓存创建一个共享相同内存的FloatBuffer。出于某种原因,FloatBuffer本身没有allocateDirect方法,这就是您必须通过ByteBuffer的原因。

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