Rendering world后的内存的释放
FW:[url]http://forum.hybrid.fi/index.php?topic=143.0[/url]
Kalle Raita是HI公司M3G规范的实现人员之一。
---------------------------------------------------------------
在测试我们的JSR184实现时,我们发现如下方式
g3d.bindTarget(myTarget);
g3d.render(myWorld);
g3d.releaseTarget();
myWorld = null;
System.gc();
并不能地释放可观的内存。首先我怀疑这是我们的一个bug,但是这实际上是这个规范的一个特性。
Graphics3D.render(World)有两方面的效果:激活的相机和激活的光照都被储存进这个Graphics3D.猛得听上去这不错是吗?但不幸的是Node具有getParent()方法。这就意味着从这个相机实例会有一串的引用到myWorld,然后从这里一直扩展到所有场景渲染中的对象。因此,这个Graphics3D实例保持着整个场景渲染的活跃。这下好了。
为了真正地释放掉内存,我们应该这样做:
g3d.bindTarget(myTarget);
g3d.render(myWorld);
g3d.releaseTarget();
myWorld = null;
g3d.setCamera(null, null);
g3d.resetLights();
System.gc();
这在你要载入若干个场景渲染并且同时调用它们时(比如游戏的不同层)非常重要。如果你不能及时释放掉旧的场景渲染,你就一下子把最大数据空间减少到原来的一半了。