如何完全删除已加载的SWF并重新加载它?(试图重新启动游戏)



我有一个加载SWF的预加载器,SWF会创建一堆听众,对象和电影剪辑。我希望所有这些都被破坏和重新创建。

我的预加载器的简化版本:

var request:URLRequest = new URLRequest("myfile.swf");
var myLoader:Loader = new Loader();
var urlLoader:URLLoader = new URLLoader();

urlLoader.addEventListener(Event.COMPLETE, function(event){ 
    stage.addChild(myLoader);
    myLoader.loadBytes(urlLoader.data);
});
urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
urlLoader.load(request);

当我尝试删除它时,我要这样做:

stage.removeChild(myLoader);
var child = loader.myLoader.content as Object;
SoundMixer.stopAll();
while(stage.numChildren > 0){
     stage.removeChildAt(0);
}
child.stop();
while(stage.numChildren > 0){
     stage.removeChildAt(0);
}
child=null;
System.gc();
myLoader.unloadAndStop(true);
System.gc();
myLoader.unload();
System.gc();
myLoader.loadBytes(urlLoader.data);
stage.addChild(loader.myLoader);

在您已加载的SWF中,您可以创建一个方法'销毁',该方法将删除所有听众,销毁所有对象并重置所有数据。

您可以从父对象(如果方法是公开)调用此方法,也可以在舞台上删除SWF时调用destroy

您可以使用JS重新加载SWF,这是这样做的简单方法。您可以检查此答案。

,或者您必须在SWF文件中执行一个好的对象以及侦听器管理和重置游戏。随着项目越来越大,这可能很复杂。您需要删除所有参考和侦听器的释放方法。

首先,您应该使用这样的加载程序类加载SWF:

 var movie:MovieClip
        var loader:Loader = new Loader();
        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete);
        loader.load( new URLRequest("myfile.swf"));
        function loadComplete(event:Event):void
       {
        movie = loader.content as MovieCLip;
        addChild(movie);
       }

    //when reloading just remove the movie object from the stage
     removeChild(movie);
    SoundMixer.stopAll();
    //......
    //.
    //.

我知道这是旧的,但是我偶然发现了它以供参考,并查看了一些我认为应该提及的东西。

system.gc() - 虽然它是您可以访问的函数,但我所看到的一切都表明,除非您使用了大量的内存,否则永远不要通过代码调用垃圾收集器。垃圾收集器通常比您何时运行有一个更好的了解(AS3中的垃圾收集?)。它不仅会影响您的应用程序的性能,而且会影响该浏览器或容器中运行的所有Flash应用程序。

也有很多人在努力使用unloadAndStop(),因为它在各种情况下似乎是不可靠的(使用unloadAndStop()方法卸载SWF,但视频听起来仍然可听见)。

要彻底,我强烈建议您将努力简单地消除所有内容,就像从已加载的闪存对象中的任何其他语言中一样,然后再删除闪存对象本身,而不是期望容器会照顾它为你。这就是为什么Flash因内存泄漏而闻名的原因。

在已加载的SWF中,添加在卸载时发射的代码。一种方法是将其添加到SWF中:

this.addEventListener(Event.REMOVED_FROM_STAGE, doUnload)

然后让Dounload Functon执行以下操作:

使用RemoveEventListener有效终止事件处理程序。您可能会回忆起您创建的所有addeventListeners,或者烹饪例程以通过播放中的对象来漫步并全部删除它们。第一个选项由于独家而更有效,但是从理论上讲,第二个选项是您可以在应用程序之间记住和复制的内容。

在变量上使用delete()使垃圾收集器可将其删除。注意:与许多语言不同,除非参考也被删除,否则将无法删除引用变量。例如:

var a:int = 0;
var b:int = a;
delete(a); // b still exists and equals 0, a is not available to GC.
delete(b); // now both variables can be removed by GC.

对于使用removechildat(0)还是单独删除子对象是一个好主意,仍然存在混乱。第一个具有明显简单且直率的好处,但这也使它引起了编码者不完全理解的警告,并且可能缺少与UnloadAndStop()类似的东西。不如用Removechild漫步对象树,并明确地消除事物,毫无疑问或不确定性。

设置此设置后,添加一个函数以卸载闪存对象会触发其自我移动,因此装载机将保持简单和整洁,然后清洁闪光灯。

最新更新