3

在使用openGL(ES)的java中,我们可以直接分配ByteBuffer

ByteBuffer bf ;
bf.allocateDirect();

但是如果 FloatBuffer 不可用,我们就不能这样做,这是为什么呢?

我想知道是不是因为:

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

4

1 回答 1

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 es 函数,您的程序将最终崩溃。希望我有所帮助。

于 2014-12-02T12:31:38.120 回答