Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.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 使用FileRerence后如何释放内存?_Actionscript 3_Flash_Memory_Actionscript_Filereference - Fatal编程技术网

Actionscript 3 使用FileRerence后如何释放内存?

Actionscript 3 使用FileRerence后如何释放内存?,actionscript-3,flash,memory,actionscript,filereference,Actionscript 3,Flash,Memory,Actionscript,Filereference,见[] FileReference.load()没有要卸载的函数,就像有新加载程序().unload()一样 必须是Flash中的“BUG”或FileReference需要改进,请键入新版本并添加如下函数:FileReference.unload() 还是我错了,存在解决方案 我试图将“NULL”设置为FileReference类型的变量,但这显然不适用于使用GC(垃圾收集器)的Flash,但这不是问题的焦点 问题是加载多个带有newfilereferencelist的文件时需要大量内存,但在

见[]


FileReference.load()
没有要卸载的函数,就像有
新加载程序().unload()一样

必须是Flash中的“BUG”或
FileReference
需要改进,请键入新版本并添加如下函数:
FileReference.unload()

还是我错了,存在解决方案

我试图将“NULL”设置为
FileReference
类型的变量,但这显然不适用于使用GC(垃圾收集器)的Flash,但这不是问题的焦点

问题是加载多个带有
newfilereferencelist
的文件时需要大量内存,但在此过程后我无法释放内存

使用
filerence
后如何释放内存

请参阅我的代码:

梅因
在将侦听对象设为空之前,请删除事件侦听器

当对象被垃圾收集时,可以使用弱引用来删除侦听器

object.addEventListener( ......, ......., false, 0, true );
例如,在LoadFile函数中:

        ...
        LoadFile(file);
    }
});
...
应该是:

        ...
        LoadFile(file);
    }
}, false, 0, true );
...
否则,您将不得不手动删除它们

为此,需要将事件处理程序移动到新的命名函数中

此外,您还需要一个数组来存储对侦听器和侦听对象的引用,以便能够在不再需要侦听器之后和将侦听对象置零之前删除侦听器

请注意:

当您测试它并查看当前内存使用情况时,请确保在您认为内存使用情况现在应该已经下降,但实际上没有下降时强制垃圾收集器

GC在需要的时候启动,而不一定是在卸载时将某些内容置空之后


说得清楚一点,我只是说在开发/测试期间强制执行GC。

即使将对象的每个引用都设为null,也不会立即从内存中删除它。您还必须删除事件侦听器。另外,永远不要使用“未命名”函数。。。当事件调用未命名函数时,很难删除侦听器。因此,创建一个新函数,并调用该函数。例如:

test.contentLoaderInfo.addEventListener(Event.COMPLETE, contentLoaderInfoComplete);
...
function contentLoaderInfoComplete(e:Event){
    test.contentLoaderInfo.removeEventListener(Event.COMPLETE, contentLoaderInfoComplete);
    test.unload();
    test = null;
}

这将清除内存。

问题是上面提到的所有问题的组合

  • 您确实需要手动删除事件侦听器。虽然使用弱引用是可能的,但如果你养成一种习惯,跟踪你注册的侦听器,并且总是正确地注销它们,那就更好了。通过这种方式,您可以更好地避免未预料到或未考虑到的内存泄漏(不完全是内存泄漏,但具有类似的效果)

  • 您正在循环中创建事件侦听器,并重新使用相同的函数来处理所有这些事件侦听器。如果这样做,您必须以某种方式获得对原始加载程序的引用,并从中删除事件侦听器。我不知道您是如何尝试合并Zhafur的答案的,但是如果您对每个新文件都使用了文件引用,这将是它仍然不起作用的原因。也许您可以用您当前拥有的代码更新上面的示例,以便我们可以进一步评论

  • 您永远不应该强制使用gc(垃圾收集器),如果您需要这样做,那么您应该像san.chez提到的那样解决其他地方的问题。强制GC是一种很好的方式,可以看出您创建的对象太多太快,如果您在强制GC之后看到内存使用率下降,那么您可能已经这样做了,并且应该重写代码以更高效地使用新的对象


  • 从您创建大量小文件或几个超大文件所消耗的内存量来看,也许您也可以告诉我们更多信息。

    我达到了我的目标,如果我这样做的话。
    FileReferenceList.fileList[5]=null
    (当“第六个文件”不再使用时)闪存会立即释放此特定的
    文件参考

    换句话说:

    这不起作用:

    private var file:FileReference;
    ...
    file = FileReferenceList.fileList[5];
    ...
    file = null;
    
    但这起到了作用:

    FileReferenceList.fileList[5] = null;
    
    在所有桌面/插件/PepperFlash上工作

    参见工作代码:

    package {
        import flash.net.FileReferenceList;
        import flash.net.FileReference;
        import flash.net.FileFilter;
        import flash.events.MouseEvent;
        import flash.events.Event;
        import flash.display.Sprite;
    
        public class Main extends Sprite
        {
            private var listFiles:Array;
            private var allTypes:Array;
            private var fileRef:FileReferenceList;
            private var tmpFile:FileReference;
            private var i:uint=0;
            private var j:uint=0;
            private var timer:uint;
            private var imageTypes:FileFilter;
            private var enable:Boolean;
    
            public function Main()
            {
                imageTypes   = new FileFilter(
                    "Images (*.JPG;*.JPEG;*.JPE;)", "*.jpg; *.jpeg; *.jpe;"
                );
                listFiles   = [];
                allTypes    = [imageTypes];
    
                eventBrowse(true);
            }
    
            private function eventBrowse(a:Boolean):void
            {
                enable = a;
                if(a===true) {
                    stage.addEventListener(MouseEvent.CLICK, browse);
    
                    fileRef = new FileReferenceList();
                    fileRef.addEventListener(Event.SELECT, select);
                } else {
                    fileRef.removeEventListener(Event.SELECT, select);
                    fileRef = null;
    
                    stage.removeEventListener(MouseEvent.CLICK, browse);
                }
            }
    
            private function browse(e:MouseEvent):void
            {
                if(enable===true) {
                    fileRef.browse(allTypes);
                }
            }
    
            private function select(e:Event):void
            {
                listFiles = fileRef.fileList;
    
                eventBrowse(false);
    
                i=0;
                j=listFiles.length;
    
                if(j>0) {
                    loadNextFile();
                }
            }
    
            private function loadNextFile():void
            {
                if(!(i<j)) {
                    listFiles = null;
                    trace("Free memory???");
                    trace("--------------");
                    trace("listFiles:"+ listFiles);
                    trace("allTypes:" + allTypes);
                    trace("fileRef:" + fileRef);
                    trace("tmpFile:" + tmpFile);
                    trace("i:" + i);
                    trace("j:" + j);
                    trace("timer:" + timer);
                    trace("--------------");
                    eventBrowse(true);
                    return;
                }
    
                tmpFile = listFiles[i];
                trace("Initiate load:" + tmpFile.name);
                tmpFile.addEventListener(Event.COMPLETE, loadedFile);
                tmpFile.load();
            }
    
            private function loadedFile(f:Event):void
            {
                trace(listFiles);
                trace("Finished load:" + tmpFile.name);
                tmpFile.removeEventListener(Event.COMPLETE, loadedFile);
    
                tmpFile = null;
                listFiles[i] = null;
    
                i++;
                loadNextFile();
            }
        }
    }
    
    包{
    导入flash.net.FileReferenceList;
    导入flash.net.FileReference;
    导入flash.net.FileFilter;
    导入flash.events.MouseEvent;
    导入flash.events.Event;
    导入flash.display.Sprite;
    公共类Main扩展了Sprite
    {
    私有var列表文件:数组;
    私有变量所有类型:数组;
    私有var fileRef:FileReferenceList;
    私有变量tmpFile:FileReference;
    私有变量i:uint=0;
    私有变量j:uint=0;
    专用var定时器:uint;
    私有var图像类型:FileFilter;
    私有变量启用:布尔;
    公共功能Main()
    {
    imageTypes=新文件过滤器(
    “图像(*.JPG;*.JPEG;*.JPE;)”,“*.JPG;*.JPEG;*.JPE;”
    );
    listFiles=[];
    allTypes=[imageTypes];
    eventBrowse(true);
    }
    私有函数eventBrowse(a:布尔):void
    {
    启用=a;
    如果(a==真){
    stage.addEventListener(MouseEvent.CLICK,浏览);
    fileRef=newfilereferencelist();
    fileRef.addEventListener(Event.SELECT,SELECT);
    }否则{
    fileRef.removeEventListener(Event.SELECT,SELECT);
    fileRef=null;
    stage.removeEventListener(MouseEvent.CLICK,浏览);
    }
    }
    私有函数浏览(e:MouseeEvent):无效
    {
    如果(启用===真){
    fileRef.browse(所有类型);
    }
    }
    专用功能选择(e:事件):无效
    {
    listFiles=fileRef.fileList;
    事件浏览(假);
    i=0;
    j=listFiles.length;
    如果(j>0){
    loadNextFile();
    }
    }
    私有函数loadNextFile():void
    {
    
    如果你试过强制gc?如果是,
    FileReferenceList.fileList[5] = null;
    
    package {
        import flash.net.FileReferenceList;
        import flash.net.FileReference;
        import flash.net.FileFilter;
        import flash.events.MouseEvent;
        import flash.events.Event;
        import flash.display.Sprite;
    
        public class Main extends Sprite
        {
            private var listFiles:Array;
            private var allTypes:Array;
            private var fileRef:FileReferenceList;
            private var tmpFile:FileReference;
            private var i:uint=0;
            private var j:uint=0;
            private var timer:uint;
            private var imageTypes:FileFilter;
            private var enable:Boolean;
    
            public function Main()
            {
                imageTypes   = new FileFilter(
                    "Images (*.JPG;*.JPEG;*.JPE;)", "*.jpg; *.jpeg; *.jpe;"
                );
                listFiles   = [];
                allTypes    = [imageTypes];
    
                eventBrowse(true);
            }
    
            private function eventBrowse(a:Boolean):void
            {
                enable = a;
                if(a===true) {
                    stage.addEventListener(MouseEvent.CLICK, browse);
    
                    fileRef = new FileReferenceList();
                    fileRef.addEventListener(Event.SELECT, select);
                } else {
                    fileRef.removeEventListener(Event.SELECT, select);
                    fileRef = null;
    
                    stage.removeEventListener(MouseEvent.CLICK, browse);
                }
            }
    
            private function browse(e:MouseEvent):void
            {
                if(enable===true) {
                    fileRef.browse(allTypes);
                }
            }
    
            private function select(e:Event):void
            {
                listFiles = fileRef.fileList;
    
                eventBrowse(false);
    
                i=0;
                j=listFiles.length;
    
                if(j>0) {
                    loadNextFile();
                }
            }
    
            private function loadNextFile():void
            {
                if(!(i<j)) {
                    listFiles = null;
                    trace("Free memory???");
                    trace("--------------");
                    trace("listFiles:"+ listFiles);
                    trace("allTypes:" + allTypes);
                    trace("fileRef:" + fileRef);
                    trace("tmpFile:" + tmpFile);
                    trace("i:" + i);
                    trace("j:" + j);
                    trace("timer:" + timer);
                    trace("--------------");
                    eventBrowse(true);
                    return;
                }
    
                tmpFile = listFiles[i];
                trace("Initiate load:" + tmpFile.name);
                tmpFile.addEventListener(Event.COMPLETE, loadedFile);
                tmpFile.load();
            }
    
            private function loadedFile(f:Event):void
            {
                trace(listFiles);
                trace("Finished load:" + tmpFile.name);
                tmpFile.removeEventListener(Event.COMPLETE, loadedFile);
    
                tmpFile = null;
                listFiles[i] = null;
    
                i++;
                loadNextFile();
            }
        }
    }