【问题标题】:Memory leaks when creating animations using JavaFX-3D使用 JavaFX-3D 创建动画时内存泄漏
【发布时间】:2016-08-31 16:01:09
【问题描述】:

我构建了一个 JavaFX(8) 3D 应用程序,它从某个文件中读取数据并将其渲染到某个场景中。

为了渲染一个对象,我使用:

graphicsContainer.getChildren().add(some3dObject);

当我注释掉这一行时,为了禁用渲染,我根本没有内存泄漏。

但是当这条线运行时,应用程序会消耗越来越多的内存。我每秒有 30 帧,每秒内存消耗增加约 50MB。

这是当然的,虽然在我使用的帧之间:

graphicsContainer.getChildren().clear();

我分配给graphicsContainer 的 3D 对象是本地的,没有保存在任何静态/全局范围内。它们仅保存为graphicsContainer 的子级,在每一帧上都会被清除。

似乎 JavaFX-3D 引擎中的某些内容并没有真正清除我的工作,尽管我每次都删除了 graphicsContainer 的子项。

知道如何让 JavaFX 3D 引擎释放过去的 3D 对象和渲染吗?

【问题讨论】:

  • 您有什么实际证据表明存在内存泄漏?它最终会完全耗尽内存吗?你怎么知道垃圾收集器根本没有确定它需要回收未使用的内存(还)?
  • 你是在 Linux 上运行它吗? JavaFX 在具有某些配置的 Linux 上存在一些内存泄漏问题(从技术上讲,泄漏可能是在 Mesa 中,而不是 Java,但 JavaFX 是我遇到的唯一地方)
  • @James_D,我使用 Windows 任务管理器查看 Java 进程的内存消耗如何在 30 秒的帧(900 帧,因为它是 30 fps)内逐渐从 110M 增加到 4000M。我尝试在每次调用 graphicsContainer.getChildren().clear() 后手动调用垃圾收集器 - 它只会导致 CPU 使用率超过 90%,而不会影响内存消耗
  • 请注意,如上所述,我目前在每一帧上都从它的子对象中清除 Group 对象并分配新的子对象。也许如果我从第一帧保存 3D 对象,并且每次只根据动画更改它们的过渡,效果会更好
  • 当我从同一帧保存 3D 对象并始终更改它们的属性而不是每次都创建新对象时似乎要好得多(尽管旧对象必须像我一样从我的范围内消失)不要将它们保存在任何地方)

标签: memory-leaks javafx-8 javafx-3d java-memory-leaks


【解决方案1】:

在我的场景中,所有帧都包含相同的 3D 对象集。唯一会随着帧的变化而变化的是这些对象的位置和变换。

我的解决方法是将我创建的每个 3D 对象(球体、圆柱体等)保存在某个数组中 - 然后在每个帧上,我只是更改它们的位置和变换,而不是创建新的 Group 和新的 3D 对象时间。

内存现在一直在 220MB 左右。

【讨论】:

  • 这是应该使用场景图的方式。不断地重新创建整个图形的东西不是一个好主意,因为场景图 API 不是即时模式渲染 API。
猜你喜欢
  • 2014-09-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-02
  • 1970-01-01
  • 2016-08-06
  • 2013-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多