0

我最近在看一个关于使用 LWJGL 用 Ja​​va 编写 OpenGL 游戏的教程。在其中,叙述者/作者首先将浮点数组从转换float[]为 a FloatBuffer,然后再将其转换为GL15.glBufferData(). 最初我并没有想太多,但我不小心GL15.glBufferData()直接给出了 float 数组而不是将其转换为 a FloatBuffer,并且代码最终还是可以工作。我查阅了文档,它只说“Array version of: BufferData”作为评论,这仍然让我不确定。

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

4

2 回答 2

1

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

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

您应该根本使用浮点数组,而只会填充您的直接NIO 缓冲区。

于 2021-03-22T19:50:50.907 回答
0

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

于 2021-03-22T19:13:59.173 回答