我有一个加载程序SWF,它在后台运行一些代码并加载其他SWF。使用此代码:
private function loadScreensaver():void {
screensaverSWF = new Loader();
var req:URLRequest;
switch(areaNumber){
case 1 :
req = new URLRequest("exNorthernFrontierScreensaver.swf");
break;
case 2 :
req = new URLRequest("exRomanEmpireScreensaver.swf");
break;
case 3 :
req = new URLRequest("exRomanCarlisleScreensaver.swf");
break;
case 4 :
req = new URLRequest("exRomanBritainScreensaver.swf");
break;
}
screensaverSWF.load(req);
addChild(screensaverSWF);
GAME_STATE = SCREENSAVER;
}
我加载了屏幕保护程序并将其添加到舞台上。使用MonsterDebugger我可以看到内存稳定地从大约80mb上升到应用程序退出(我使用Windows投影仪)。我无法解决的原因是,屏幕保护程序SWF没有附加代码,只是一些时间线动画渐渐消失。 知道这里发生了什么吗?
编辑: 我一直在测试,发现我有一个图像,从舞台开始然后打开和关闭,并删除。当它循环时,它再次添加到内存中,就像第一个图像仍然保留一样。这一切都是在时间表上完成的。
EDIT2: http://www.rezmason.net/blog/caching-timeline-objects-in-flash这似乎是问题,但没有给出解决方案。这个屏幕保护程序每天最多可以运行6个小时,此时它会在2个小时后退出。
答案 0 :(得分:3)
你永远不会清除外部加载的swfs内存。一旦你从外面装载了一些东西,如果你看到之后的内存下降,这将是一个奇迹。因此,如果您要在swf的生命周期中找到可能“加载”同一资产多次的情况,则需要保留最初加载的资产并重新使用它。该函数看起来可能会重复调用,而且每次执行此操作时,您只需重新加载已加载的资源。
那样最糟糕的情况就是你只需要让每个屏幕保护程序都悬空,但每个屏幕保护程序只有一个。
答案 1 :(得分:1)
确定排序问题。它似乎在动画结束时删除图像,然后循环动画会使它们重复添加到内存中。图像现在要么不可见,要么在舞台上移动到最后,以便重复使用。
答案 2 :(得分:0)
虽然您无法从内存中卸载远程SWF中的代码和任何嵌入图像,但通常可以处理大量已创建的数据。一种简单的方法是遍历swf中的每个显示子节点并在每个子节点上调用removeChild
。为了更好地衡量,我还会对stop()
类型的每个孩子发送Movieclip
。这将有助于降低实例在其显示中使用的图像/动画的内存占用量。
答案 3 :(得分:0)
我不确定这是否会解决它,但每当加载新代码时,它都会加载到当前的ApplicationDomain中,而您无法从应用程序域中卸载“某些”代码。也许如果您为每个加载的swf创建一个新的ApplicationDomain,一旦取消引用它就可能会收集垃圾。
screensaverSWF.load(req, new LoaderContext(false, new ApplicationDomain()));
答案 4 :(得分:0)
如果再次遇到此问题,SWFWire Debugger的 Object 选项卡可能会通过显示已添加或删除的对象列表来帮助您找到内存泄漏(假设所有内容都是AS3)。