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();
}
}
}