首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AS3 BitmapData内存泄漏

AS3 BitmapData内存泄漏
EN

Stack Overflow用户
提问于 2012-08-06 17:25:25
回答 1查看 2.3K关注 0票数 2

这是在AS3上对BitmapData内存分配的简单测试。

代码语言:javascript
复制
private function memoryTest(): void
{
  trace("BitmapData memory test. Create bmps..."); // First breakpoint
  var bmps:Array = new Array (1000);

  for (var i:int=0; i<1000; i++)
  {
    bmps[i] = new BitmapData(451, 451, true, 0);
    trace(i+". bmp created");
  }

  trace("All bmps created."); // Second breakpoint

  for (i=0; i<1000; i++)
  {
    bmps[i].dispose();
    bmps[i] = null;
  }
  bmps.splice(0, bmps.length);
  bmps = null;

  freeMemoryGC();

  trace("All bmps deleted.");
  trace("Test complete."); // Last breakpoint
}

private function freeMemoryGC(): void
{
  // the GC will perform a full mark/sweep on the second call.
  try
  {
    new LocalConnection().connect('foo');
    new LocalConnection().connect('foo');
  }
  catch (e:*)
  {
  }

  System.gc();
  System.gc();
}

在这个测试中有3个断点,在代码中进行注释。断点暂停程序在一段时间。断点对应于此内存状态图上的水平线。

我的问题是:为什么在dispose()调用之后不释放所有内存?这段代码有什么问题,以及如何正确清除BitmapData对象?

更新1:我不认为这个问题在垃圾收集器中。dispose()工作在GC之外,它应该释放像素数据。此外,此示例还应分配451*451*4*1000字节theoretically.。但是这个测试应用程序在System.privateMemory中分配25%的字节,这25%从未被GC和dispose()释放。

UPDATE 2:如果我创建13个映像4059x4059PX而不是100个图像451x451 px,那么内存分配完全等于理论大小,内存在调用GC后正确释放!我不知道为什么会这样。

UPDATE3:这是我的区间测试结果,由Daniel MesSer在他的答案中创建:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-06 17:37:48

尝试删除免费内存函数中的本地连接。这能解决问题吗?

编辑:

代码语言:javascript
复制
package nyx_gaming_group.as3_tests {
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.system.System;
import messer_entertainment.MesSerUtils;

/**
 * ...
 * @author Daniel Dahlkvist
 */
public class BitmapDataMemoryLeak extends Sprite {
    private var _bitmaps:Array;

    public function BitmapDataMemoryLeak() {
        run();
    }

    private function run():void {
        MesSerUtils.delayCall(createBitmaps, 150);
        MesSerUtils.delayCall(destroyBitmaps, 4500);
        MesSerUtils.delayCall(freeMemoryGC, 4700);
        MesSerUtils.delayCall(run, 8000);
    }

    private function createBitmaps():void {
        trace("BitmapData memory test. Create bmps..."); // First breakpoint
        _bitmaps = new Array(1000);

        for (var i:int = 0; i < 1000; i++) {
            _bitmaps[i] = new BitmapData(451, 451, true, 0);
        }

        trace("All bmps created."); // Second breakpoint            
    }

    private function destroyBitmaps():void {
        for (var i:int = 0; i < _bitmaps.length; i++) {
            _bitmaps[i].dispose();
            _bitmaps[i] = null;
        }
        _bitmaps = null;

        trace("All bmps deleted.");
        trace("Test complete."); // Last breakpoint
    }

    private function freeMemoryGC():void {
        System.gc();
    }
}
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11833009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档