java - 为什么在 ByteBuffer 中可以直接分配字节,而不能在 FloatBuffer 中分配 float

标签 java memory-management opengl-es bytebuffer floatbuffer

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

ByteBuffer bf ;
bf.allocateDirect();

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

我想知道是不是因为:

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

最佳答案

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

关于java - 为什么在 ByteBuffer 中可以直接分配字节,而不能在 FloatBuffer 中分配 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27244965/

相关文章:

java - 使用 jackson 可以吗?

matlab - 如何以异步方式有效地将变量从 Matlab 传递到 GPU?

ios 阻止潜在的内存泄漏

ios - 显示空白屏幕的webview屏幕截图

android - 什么是顶点步幅?

ios - 是否允许指向 Objective-C 数组的指针(通过桥接 header )?

java - 如何在 Java 的交互式命令行过程中输入值?

java - 执行外部Java代码并获取输出

java - jcifs.smb.SmbAuthException : Logon failure: user not allowed to log on to this computer

iphone - 带 OpenGL 着色器的高斯滤波器