gpt4 book ai didi

java - BufferUtils 和 MemoryUtil 有什么区别? (LWJGL)

转载 作者:行者123 更新时间:2023-12-04 15:08:50 24 4
gpt4 key购买 nike

我一直使用 MemoryUtil 来存储 float 缓冲区,但人们似乎为此使用了 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();
}

最佳答案

LWJGL 3 的 org.lwjgl.BufferUtils 类只是 Java 的 java.nio.ByteBuffer.allocateDirect() 方法的一个小外观,允许您使用 JVM 的内存用于分配堆外内存并返回 NIO ByteBuffer(或其类型化 View )的分配器,包括确保 ByteOrder 为 nativeOrder()

ByteBuffer.allocateDirect() 分配的 NIO 缓冲区由 JRE 内部管理,一旦 native 内存变得不可访问,它就会作为垃圾收集周期的一部分隐式释放。

使用这种方法分配堆外内存有很多缺点,例如(引自“Memory management in LWJGL 3”):

-引用开始-

  • 它很慢,比原始的 malloc() 调用慢得多。在一个已经很慢的函数之上有很多开销。

  • 它在争用下扩展性很差。

  • 它任意限制分配的内存量 (-XX:MaxDirectMemorySize)。

  • 与 Java 数组一样,分配的内存始终清零。这不一定是坏事,但有选择会更好。

  • 没有办法按需释放分配的内存(没有特定于 JDK 的反射技巧)。相反,使用引用队列通常需要两个 GC 周期来释放 native 内存。这通常会导致在压力下出现 OOM 错误。

-引用结束-

另一方面,LWJGL 3 的 org.lwjgl.system.MemoryUtil 类允许您使用其他 native /堆外内存分配器而不是 JVM 的 ByteBuffer 分配器来分配堆外 native 内存,包括只为您提供原始虚拟内存地址作为 long 的选项,避免 NIO Buffer 实例。

LWJGL 支持 C 标准库的系统分配器 (malloc) 以及当前 jemallocrpmalloc .所有这些都提供了一种比 Java 的 ByteBuffer.allocateDirect() 更快的替代方法,从而减轻了上述缺点。

因为 native 内存不再由 JVM 管理,您必须自己释放内存,为此有 org.lwjgl.system .MemoryUtil.memFree() 方法。

在继续之前,您应该完整阅读提到的 LWJGL 博客文章,因为有更多选项,例如 org.lwjgl.system.MemoryStack,用于分配 native 堆外内存在特定情况下(例如短暂的内存),它甚至比上面提到的所有其他替代方案更快。

关于java - BufferUtils 和 MemoryUtil 有什么区别? (LWJGL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65599336/

24 4 0
文章推荐: android - ToolBar MenuItem 中 BadgeDrawable 的 LiveData 更新
文章推荐: php - GitLab PHP docker 镜像 - 您的系统中缺少请求的 PHP 扩展 gd
文章推荐: c# - 任务卡在 "[Scheduled and Waiting to Run]"
文章推荐: css - 如何使用 rvest 选择所有没有类或 id 的
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com