我总是用 MemoryUtil
存储浮动缓冲区,但人们似乎使用 BufferUtils
对于它:
private IntBuffer convertToIntBuffer(int[] data) {
IntBuffer buffer = BufferUtils.createIntBuffer(data.length);
return buffer.put(data).flip();
}
private FloatBuffer convertToFloatBuffer(float[] data) {
FloatBuffer buffer = MemoryUtil.memAllocFloat(data.length);
return buffer.put(data).flip();
}
1条答案
按热度按时间s71maibg1#
lwjgl 3的
org.lwjgl.BufferUtils
类只是java的一个小门面java.nio.ByteBuffer.allocateDirect()
方法,允许您使用jvm的内存分配器来分配堆外内存并返回nioByteBuffer
(或其打印视图),包括确保字节顺序nativeOrder()
.分配的nio缓冲区
ByteBuffer.allocateDirect()
是由jre内部管理的,本机内存一旦变得不可访问,就会作为垃圾回收周期的一部分隐式释放。使用这种方法分配堆外内存有很多缺点,例如(引用“lwjgl3中的内存管理”):
-报价开始-
它很慢,比原始的malloc()调用慢得多。在一个已经很慢的函数上有很多开销。
在争论之下,它的规模非常大。
它任意限制分配的内存量(-xx:maxdirectmemorysize)。
与java数组一样,分配的内存总是归零。这不一定是坏事,但有选择会更好。
没有办法按需释放分配的内存(没有jdk特定的反射黑客)。相反,使用的引用队列通常需要两个gc周期来释放本机内存。这常常导致在压力下出现错误。
-报价单结束-
lwjgl 3的
org.lwjgl.system.MemoryUtil
另一方面,类允许您使用其他本机/堆外内存分配器而不是jvm的bytebuffer分配器来分配堆外本机内存,包括将原始虚拟内存地址作为long
,避开nioBuffer
示例。lwjgl支持c标准库(malloc)的系统分配器,目前还支持jemalloc和rpmalloc。所有这些都提供了一种比java的bytebuffer.allocatedirect()更快的替代方法,从而减轻了上述缺点。
因为本机内存不再由jvm管理,所以您必须自己释放内存,这是必须的
org.lwjgl.system.MemoryUtil.memFree()
方法。但是,在继续之前,您应该完整地阅读前面提到的lwjgl博客文章,因为还有更多选项,例如
org.lwjgl.system.MemoryStack
,用于在特定情况下(例如短寿命内存)分配本机堆外内存,这甚至比上面提到的所有其他替代方法都要快。