Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 AS3:主要减速_Actionscript 3_Memory Leaks - Fatal编程技术网

Actionscript 3 AS3:主要减速

Actionscript 3 AS3:主要减速,actionscript-3,memory-leaks,Actionscript 3,Memory Leaks,我正在做一个Flash游戏,运行了一段时间后,帧速率大幅下降。屏幕上一次出现的MovieClips并不多,但MovieClips经常被removeChild和addChild取代 如何测试内存泄漏等问题?关于这个问题,有哪些好的AS3编程标准?看起来您并没有为垃圾收集准备MovieClip的实例可能对您非常有帮助 正确丢弃电影剪辑(或任何其他对象)时,您希望涵盖的一些基本内容包括: 从显示列表中删除该对象(如果它是显示对象)。这是通过您正在执行的操作来完成的,removeChild() 删除已应

我正在做一个Flash游戏,运行了一段时间后,帧速率大幅下降。屏幕上一次出现的MovieClips并不多,但MovieClips经常被removeChild和addChild取代


如何测试内存泄漏等问题?关于这个问题,有哪些好的AS3编程标准?

看起来您并没有为垃圾收集准备
MovieClip
的实例可能对您非常有帮助

正确丢弃电影剪辑(或任何其他对象)时,您希望涵盖的一些基本内容包括:

  • 显示列表
    中删除该对象(如果它是
    显示对象
    )。这是通过您正在执行的操作来完成的,
    removeChild()
  • 删除已应用于对象的所有事件侦听器。最好的办法是从一开始就掌握这一点;我的意思是,当您调用
    addEventListener()
    时,一定要在不久的将来添加一个姐妹
    removeEventListener()
  • 删除对对象的引用。这包括但不限于:通过作为数组/向量的一部分来引用对象,通过存储在另一个对象的属性中来引用对象,等等
  • 我可以提供的一个建议是在对象的基类中有一个处理所有这些的方法,例如
    remove()
    deconstruct()

    下面是一个例子:

    public function deconstruct():void
    {
        if(parent)
            parent.removeChild(this);
    
        removeEventListener(MouseEvent.CLICK, _onClick);
    }
    
    当您扩展此类并需要其他解引用功能时,只需基于
    deconstruct()
    方法:

    override public function deconstruct():void
    {
        removeEventListener(MouseEvent.MOUSE_OVER, _mouseOver);
    
        var i:int = someArray.indexOf(this);
        someArray.splice(i, 1);
    
        super.deconstruct();
    }
    

    有可能你没有为垃圾收集做好准备。您是否正在删除所有事件侦听器和对MovieClips的引用?实际上,我并没有删除侦听器。我假设removeChild会自动删除添加到MovieClips中的侦听器。这似乎是问题所在。没有事件侦听器会停止对象的GCing。并非所有对象都是显示对象,但所有对象都可以分派事件。因此,在您的情况下,一个从未添加到stage的数据类将是GCed。你知道这会是一个巨大的失败吗?删除事件监听器以GC对象,当然任何子对象也需要它。还要确保从添加到其中的任何数组中删除MovieClips。