【发布时间】:2011-08-12 09:59:31
【问题描述】:
我们目前正在开发一个应用程序,它可以在 4D 的球体/平面上可视化巨大的矢量场 (> 250'000)。为了加快这个过程,我们对顶点、法线和颜色使用 VBO。为了在发送到 GPU 之前准备数据,我们使用了缓冲区(FloatBuffer、ByteBuffer 等)。
气缸的一些数据: 每个柱面使用 16 * 9 + 16 * 3 = 192 个浮点数 -> 192 * 4 字节 = 768 个字节。
在发送顶点之后,我们正在进行以下清理:
// clear all buffers
vertexBufferShell.clear();
indexBufferShell.clear();
vertexBufferShell = null;
indexBufferShell = null;
我们使用 JConsole 对其进行了监控,我们发现 GarbageCollector 没有“正确”运行。即使我们关闭柱面计数,内存也不会被释放。在 JConsole 监控工具中有一个运行 GC 的按钮,如果我们手动执行此操作,它会释放内存(如果我们加载了大量的柱面并减少了很多,有时超过 600mb 会被 GC 清理)。
这里是 JConsole 的图片:
现在的问题是我们如何在代码中自己清理这个缓冲区?调用 clear 方法并将引用设置为 null 是不够的。我们也尝试调用 System.gc() 但没有任何效果。你有什么想法吗?
【问题讨论】:
-
+1 对于关心内存的 Java 程序员,尽管它可能是徒劳的。
标签: java opengl buffer jogl vbo