2014-12-02 67 views
3

没有浮点在Java中,我们可以直接分配字节缓冲区一样为什么我们直接分配字节的ByteBuffer,但用openGL(ES)在FloatBuffer

ByteBuffer bf ; 
bf.allocateDirect(); 

但是,我们不能这样做,在FloatBuffer的情况下,没有这是为什么呢?

我不知道是否是因为:

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

回答

3

OpenGL es写在c。在C浮动,整数等是不是像Java一样的固定大小。 java中的浮点数是32位。现在让我们来看看java如何使用opengl。当你使用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函数,你的程序将最终崩溃。希望我帮助。

+0

OpenGL将自己的类型用于浮点数,整数等,这些类型具有明确定义的大小。这些类型的大小没有平台依赖性。每个平台上的“GLfloat”保证为32位。 – 2014-12-02 15:59:28

+0

是的,glfloat保证是32位的,但是当你在opengl es中发送顶点时,它们不是GLfloats,而是漂浮的,这意味着依赖于平台,你必须使用nio缓冲区。纠正我,如果我错了,我没有经历过你。 – KostasRim 2014-12-02 20:35:45

相关问题