Tim*_*Tim 44 java android opengl-es
我一直在我的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
Run Code Online (Sandbox Code Playgroud)
这看起来非常冗长和混乱,据我所知,这只是一个漂浮的数组的花哨包装.
问题:
这种类(ByteBuffer,FloatBuffer)的理由是什么,而不是任何其他类型的集合或简单的浮点数组?
在将ByteBuffer转换为FloatBuffer之前创建ByteBuffer背后的想法是什么?
mik*_*era 43
主要原因是性能:ByteBuffers和其他NIO类在与本机代码连接时启用加速操作(通常避免将数据复制到临时缓冲区).
如果您正在进行大量的OpenGL渲染调用,这非常重要.
首先创建ByteBuffer的原因是您希望使用allocateDirect调用来创建直接字节缓冲区,这可以从加速操作中受益.然后,您可以从中创建一个共享相同内存的FloatBuffer.由于某种原因,FloatBuffer本身没有allocateDirect方法,这就是你必须通过ByteBuffer的原因.
Anc*_*hal 14
我们在Android上使用Java进行编码,但OpenGL ES的底层实现实际上是用C语言编写的.在我们将数据传递给OpenGL之前,我们需要将其转换为它将要理解的形式.Java和本机系统可能不会以相同的顺序存储它们的字节,因此我们使用一组特殊的缓冲区类并创建一个足够大的ByteBuffer来保存我们的数据,并告诉它使用本机字节顺序存储其数据.然后我们将它转换为FloatBuffer,以便我们可以使用它来保存浮点数据.最后,我们将数组复制到缓冲区中.
归档时间: |
|
查看次数: |
17318 次 |
最近记录: |