bufferutils和memoryutil有什么区别(lwjgl公司)

bejyjqdl  于 2021-06-26  发布在  Java
关注(0)|答案(1)|浏览(403)

我总是用 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();
}
s71maibg

s71maibg1#

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

相关问题