在 LWJGL 3.0 中给 GL15.glBufferData() 浮点数组或 FloatBuffer 有什么区别吗?

Is there any difference between giving GL15.glBufferData() a float array or a FloatBuffer in LWJGL 3.0?

我最近在看一个使用 LWJGL 在 Java 中编写 OpenGL 游戏的教程。其中,narrator/author 首先将 float 数组从 float[] 转换为 FloatBuffer,然后再将其提供给 GL15.glBufferData()。最初我并没有多想这个,但我不小心直接给了 GL15.glBufferData() 浮点数组而不是将它转换为 FloatBuffer,代码最终还是可以工作。我 looked up the documentation 它只说“数组版本:BufferData”作为评论,这仍然让我不确定。

这让我想知道,在使用 Java 在 LWJGL 3.0 中调用 GL15.glBufferData() 时,是否需要努力将 float[] 转换为 FloatBuffer 15,假设 FloatBuffer 是通过使用 FloatBuffer::put() 赋值的,因此包含相同的数据?

我建议使用 float[] 而不是 FloatBuffer,因为 float[] 似乎更有效,而且它正是您所期望的:堆栈上的字节数组。此外,在幕后,FloatBuffer 实际上只是一个 float[],所以在一天结束时它并不重要。继续我的观点,将 float[] 转换为 FloatBuffer 似乎是不必要的,而且过于复杂。

direct NIO Buffer 和 float 数组的区别在于,当您将 float 数组传递给 LWJGL 时,它首先需要使用 JNI 调用将数组固定到Java 运行时,它将为 LWJGL 的本机代码提供一个虚拟内存地址,它可以将其移交给实际调用的本机函数。然后,需要再次取消固定浮点数组,使其再次符合垃圾回收条件。

使用 direct NIO Buffer,这不需要发生,因为 direct NIO Buffers 已经由本地虚拟内存支持地址。所以使用 direct NIO 缓冲区要快得多(性能方面)。当然,当您先创建一个浮点数组然后将其复制到 NIO Buffer 中时,所有这些性能都会有所损失。

你应该简单地使用浮点数组,但只填充你的direct NIO缓冲区。