快速导航:   教程资源  | 经典范例  | 友情链接  | 联系我们  | 官方微博
登陆 | 注册

 flash 3d 研究所
flash3d 研究所 pv3d 教程 研究所小贴士: Flash11下任然应该以cpu下的效率开发为主










最近更新:
● wan925446570阁下在讨论区里 发表新主题“怎么配置away3d运行环境啊???...”(20:38:35)
● yanfaqiang阁下在讨论区里 回复“《超简易papervision3D基础 ...”(18:08:41)
● cripel阁下在讨论区里 回复“...”(14:38:04)
浏览主题:依然关于removeChild的内存泄漏

依然关于removeChild的内存泄漏
cailven (2011-01-27 15:12:59)

我的代码是这样的。

var agency:DisplayObject3D=new DisplayObject3D();
agency.removeChild(beforetarget);
scene.addChild(beforetarget);

scene.removeChild(nowtarget);
agency.addChild(nowtarget);

beforetarget=nowtarget;

我一开始以为是贴图信息无法清楚造成的,后来我把材质改成了线框去跑,依然卡的不行,一打开时候有27fps,这段代码运行个20多遍在线框的情况下依然变成了5fps。

但是我的项目要求又必须得大量使用加载入容器,然后移除到场景的方法。
现在确定就是这段代码惹得祸,只要不removeChild,不addChild,程序可以一直维持27fps,一用就开始越来越卡了。

头痛死我了,大家看看有什么办法可以解决。谢谢







flash 3d 研究所 cailven
(2011-01-28 11:41:05)
经过昨天的彻夜冥想,解决了

var agency:DisplayObject3D=new DisplayObject3D();

agency=nowtarget;

我跳过removeChild这步,直接用agncy指过去,运行下来确实不卡了。

因为我必要在agncy上加交互事件的,以前的思路是交互放在容器上,然后物体运行的时候加入到容器里面然后把旧的物体移出来。

现在等于是直接把agncy指向物体就ok了,还想了一晚上,看来实在太笨了。

绕过remove的方法解决了我的问题,但是removeChlid的问题依然没有解决,大家看看能否有好方法,以后到非用不可的时候又要麻烦了。大家一起讨论下吧


flash 3d 研究所 DDM君
(2011-01-28 12:27:33)
感谢cailven的热心分享,很棒的。
您是使用pv3d对吧,还是要回归到flash的根本来说,"flash仅当整个程序对某个内存没有任何引用的时候,才回收内存"
beforetarget在第一次add的时候,在pv3d中不只一次被引用,这时removeChild beforetarget, 只断开了agency链而已,并没有消灭beforetarget本身。
必须要写一个消灭的方法,每次调用都让beforetarget的各个属性=null,才可能完全去除beforetarget。

但是涉及到贴图的时候,就更为复杂。


flash 3d 研究所 cailven
(2011-01-28 15:52:15)
谢谢DDM,断开没用的,我后来的做法尝试过
每次都 beforetarget=null;
beforetarget= new DisplayObject3D();
结果问题依旧,你说是贴图没有清干净,我后来换成线框换成颜色贴图,但是丝毫没有变化。所以我断定并非贴图问题,而是pv3d里面的那个removeChild()的内建结构问题。

因为我们平时使用中一般只是scence.addChild(model),即使用到removeChild也只是一两次而已。很少遇到想我这种加在交互里面反复频繁使用的。所以很少发现这个问题。

所以我现在的解决方法就是知道removeChild有bug,以后就少用,尤其平凡使用中尽量避免,这就是我这次的casestudy :)


flash 3d 研究所 fur3
(2011-01-30 14:52:01)
很好呀 1年多没看pv3d了记不太清楚 但是记得是scene还是什么地方dictionary没有被清理掉的原因


评论人:
邮   箱: (填入邮箱,博客地址均可)

内   容: (广告和垃圾内容可能会被删除,望理解)
链接地址

验证码:(为防止机器人骚扰,请麻烦输入验证码^_^)
  

(目前需登陆方可发表)


不想添加了