Rendering world后的内存的释放

本文探讨了JSR184中Graphics3D.render(World)方法导致的内存管理问题。由于该方法会保留场景图的引用,如果不正确释放,会导致大量内存无法回收。文章提供了一种有效的内存释放策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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();


这在你要载入若干个场景渲染并且同时调用它们时(比如游戏的不同层)非常重要。如果你不能及时释放掉旧的场景渲染,你就一下子把最大数据空间减少到原来的一半了。

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值