LWJGL/OpenGL Java Matrix4f占用大量内存

LWJGL/OpenGL Java Matrix4f占用大量内存,java,opengl,memory,matrix,lwjgl,Java,Opengl,Memory,Matrix,Lwjgl,我目前正在用LWJGL制作一个3D游戏引擎,最近还实现了骨骼动画。我让每个关节都有矩阵(Matrix4f)来表示位置和旋转,我注意到我的游戏在几分钟内变得非常不稳定,决定注释掉骨骼动画代码,并且没有帧丢失。然后我假设它可能是: a。内存泄漏(我希望不是)或 b。图形卡(我在MacBook Air上运行,4GB RAM,图形:Intel HD Graphics 6000 1536 MB,处理器:1.6 GHz Intel Core i5) 然后,我使用JProfiler调查内存使用情况。该图显

我目前正在用LWJGL制作一个3D游戏引擎,最近还实现了骨骼动画。我让每个关节都有矩阵(Matrix4f)来表示位置和旋转,我注意到我的游戏在几分钟内变得非常不稳定,决定注释掉骨骼动画代码,并且没有帧丢失。然后我假设它可能是:

  • a。内存泄漏(我希望不是)或
  • b。图形卡(我在MacBook Air上运行,4GB RAM,图形:Intel HD Graphics 6000 1536 MB,处理器:1.6 GHz Intel Core i5)
然后,我使用JProfiler调查内存使用情况。该图显示了山脉(最大使用内存:27.18MB最小可用内存:34.77MB)

然后我查看了实时内存,在顶部(大多数情况下)是Matrix4f,使用623KB的内存,char[]有时以642KB的内存领先


这是我投资了1年左右的第一个项目,所以我对此不太了解,所以它是图形卡还是内存?我应该担心吗?我能做些什么使它运行得更好?

欢迎来到托管内存语言的世界:-)。您看到的是垃圾收集器正在清理临时变量。简而言之,您创建的所有矩阵都必须在某个点释放。释放是由垃圾收集器完成的,它会暂停游戏一段时间,以找出哪些矩阵仍在使用,哪些可以释放。如果有大量免费的东西,这可能需要相当长的时间,你的游戏将“挂起”。解决这个问题需要减少本地分配,查看动画代码并删除所有不必要的新闻。此外,看到的字符是字符串。您分配了太多的字符串,可能是因为您正在使用它们进行“计算”(比如string+string),有很多方法可以解决这个问题,看看StringBuffer类。而且,java中的内存泄漏很难产生,甚至不可能,这取决于您对“内存泄漏”的定义。如果你愿意,我可以键入一个更完整的答案,但我现在应该正在工作,所以请留下一条消息:-)如果我可以添加任何内容,请尝试在帧之间重用数据,并尝试在ArrayList上使用数组作为大数据缓冲区。在我的例子中,这两件事对内存使用都有很大的帮助。@Bartvbl这是一个很好的建议,但我建议在直接移动到数组之前,首先尝试预大小的ArrayList,这需要更少的代码,并且类似地是无垃圾的。这可以通过将初始容量传递给arraylist构造函数来完成。现在将使用该大小预先分配列表,并且在超过该大小之前不会进行重新分配。如果初始容量足够,这将永远不会发生,数组列表的行为将类似于数组。还要注意的是,arraylists,afaik,并没有减少它们自己的大小,这使得它们很少是重复GC的原因hangs@TWT当前位置我意识到这不完全是这个问题的范围,但这是我个人与垃圾收集器争论最多的地方。渲染的诀窍是尽量减少紧循环中对象的创建,这意味着如果不是严格必要的话,这些ArrayList首先不应该在每一帧中创建。