为什么我们可以在ByteBuffer中直接分配字节,但不能在FloatBuffer中直接分配浮点数

时间:2014-12-02 08:30:14

标签: java memory-management opengl-es bytebuffer floatbuffer

在使用openGL(ES)的java中,我们可以像

一样直接分配ByteBuffer
ByteBuffer bf ;
bf.allocateDirect();

但是我们不能这样做,以防FloatBuffer无法使用,为什么会这样?

我想知道是否是因为:

Byte可以在硬件级别访问(因为OpenGL在硬件上方工作,与delvik不同),硬件中的寄存器(GPU的硬件)以字节为单位,甚至浮点数也应该存储在4字节寄存器中,这可能是不可用的,所以我们不能直接分配,而是应该告诉缓冲区为给定大小的块分配内存,然后将数据放入这些块并再次将其作为FloatBuffer处理。

1 个答案:

答案 0 :(得分:3)

OpenGL es用c编写。在c浮点数中,整数等不像java那样固定大小。 java中的浮点数是32位。现在让我们来看看java如何使用opengl es。当您使用java将顶点发送到图形管道时,您实际上调用了为您执行脏工作的c函数。这被称为ndk,您可以在此处找到更多信息:https://developer.android.com/tools/sdk/ndk/index.html。 C被转换为汇编代码,因此每个浮点数在每个电话上可以具有不同的字节大小,具体取决于cpu架构。您可以使用nio缓冲区(更多这里:https://docs.oracle.com/javase/7/docs/api/java/nio/Buffer.html)来确保您的浮点数组大小基于您手机的cpu架构(本机顺序)而不是基于jvm固定基本大小。最后,想象一下你有一个java浮点数的顶点数组(32位固定大小)。你的cpu浮点数是64位。如果从java调用opengl es函数,程序将最终崩溃。希望我能帮忙。