Flash AS3/闪存位图数据。绘制内存泄漏

Flash AS3/闪存位图数据。绘制内存泄漏,flash,actionscript-3,flash-cs5,bitmapdata,Flash,Actionscript 3,Flash Cs5,Bitmapdata,我有一个大的雪碧…我把它分成几个小的,功能如下。该函数工作得很好,但my.swf的内存使用量急剧增加 我做错了什么 private function split_sprite(sp:Sprite,the_parrent:Sprite) { var region:Rectangle = new Rectangle(); region = sp.getBounds(the_parrent); var w=region.width/10; var h = regi

我有一个大的雪碧…我把它分成几个小的,功能如下。该函数工作得很好,但my.swf的内存使用量急剧增加

我做错了什么

private function split_sprite(sp:Sprite,the_parrent:Sprite) {


    var region:Rectangle = new Rectangle();
    region = sp.getBounds(the_parrent);

    var w=region.width/10;
    var h = region.height ;

    for (var i=0;i<10;i++){ 
            //Build Matrix Transform
            var mat:Matrix= new Matrix(1,0,0,1, 0-w*i, 0 );
            sp.transform.matrix = mat;

            //Draw the bitmap
        var temp:BitmapData = new BitmapData(w + 2 , h, true, 0x000000);


            temp.draw(sp,mat);

            //Attach the BitmapData to a Bitmap Instance
            var myBitmap:Bitmap = new Bitmap(temp);
            myBitmap.smoothing = true;
            //Re apply an Inverse Matrix
            mat = new Matrix(1,0,0,1, region.x, region.y);
            myBitmap.transform.matrix = mat;
            var spp=new Sprite();
             //spp.cacheAsBitmap=true;
            spp.addChild(myBitmap);
            spp.x=w*i;
            the_parrent.addChild(spp);


    }



}
专用函数拆分精灵(sp:sprite,部分:sprite){
变量区域:矩形=新矩形();
region=sp.getBounds(参数);
var w=区域宽度/10;
var h=区域高度;

对于(var i=0;i如果我没记错的话,BitmapData将永远不会被垃圾收集-您正在创建许多新的BMD对象,但是当您使用完它们后,您必须调用myBitmapDataObject.dispose()我不知道这是否会有帮助-你没有很多关于这个memroy泄漏性质的详细信息-但这是一个可以查看的地方。如果你不dispose()的话,BitmapData对象可能会快速消耗大量内存正确初始化。

如果我没记错的话,BitmapData将永远不会被垃圾收集-您正在创建许多新的BMD对象,但是当您处理完这些对象后,您必须调用myBitmapDataObject.dispose()我不知道这是否会有帮助-你没有很多关于这个memroy泄漏性质的详细信息-但这是一个可以查看的地方。如果你不dispose()的话,BitmapData对象可能会快速消耗大量内存正常运行。

你能详细说明一下内存使用量的急剧增长吗?在舞台上添加一堆位图会增加内存占用空间…泄漏意味着你正在删除它们,但内存没有被释放。内存使用量从30 MB增加到100+MB。以下是我试图做的:我正在开发一款具有相当大内存的游戏e层(9000+像素宽,1500+高),层中的地形通过点(顶点)列表生成并用beginBitmapFill填充图案。游戏在我的i5处理器上运行良好,但当我在较慢的计算机上运行它时,帧速率从27 fps下降到14-17 fps。我做了一些挖掘和测试,发现大地形导致了这个问题……所以开始阅读如何优化它。我在一个父s上添加了一个scrollRectprite-这提高了一点性能,我正在阅读有关位图缓存的文章…但这有其局限性…所以我决定拆分我的sprite,使其足够小,可以缓存。关于如何完成此操作,有什么建议吗?或者关于提高性能的任何其他建议。谢谢。你熟悉位图Blitting吗?基本概念是你有y我们巨大的9000x1500 BitmapData对象在内存中的某个位置,这很好,但您从未将其添加到后台。相反,您向后台添加一个位图,填充整个屏幕,然后使用BitmapData的“copyPixels()”方法在每一帧上填充输出位图。@Myk copyPixels()的源是位图数据,因此他需要首先将精灵绘制到位图数据上。您可以详细说明内存使用量的急剧增长吗?在舞台上添加一堆位图将增加内存占用空间…泄漏意味着您正在删除它们,但内存没有被释放。内存使用量从30 MB增加到100+MB。以下是这就是我要做的:我正在做一个有相当宽的关卡(9000+px宽和1500+高)的游戏,关卡中的地形是通过点(顶点)列表生成的并用beginBitmapFill填充图案。游戏在我的i5处理器上运行良好,但当我在较慢的计算机上运行它时,帧速率从27 fps下降到14-17 fps。我做了一些挖掘和测试,发现大地形导致了这个问题……所以开始阅读如何优化它。我在一个父s上添加了一个scrollRectprite-这提高了一点性能,我正在阅读有关位图缓存的文章…但这有其局限性…所以我决定拆分我的sprite,使其足够小,可以缓存。关于如何完成此操作,有什么建议吗?或者关于提高性能的任何其他建议。谢谢。你熟悉位图Blitting吗?基本概念是你有y我们巨大的9000x1500 BitmapData对象在内存中的某个位置,这很好,但您从未将其添加到后台。相反,您向后台添加一个位图,填充整个屏幕,然后使用BitmapData的“copyPixels()”方法在每一帧上填充输出位图。@Myk copyPixels()的源是位图数据,因此他需要先将精灵绘制到位图数据上。我尝试了temp.dispose();然后从中创建位图(myBitmap:bitmap=new bitmap(temp);)但这也会破坏位图…对不起,我在AS3方面不是很有经验。哦,对不起,是的-这是用于处理特定的BitmapData对象时。当您仍要使用它时不要进行处理-当您不再使用它时进行处理。例如,如果您多次重新加载同一图像,则可能会丢失为每个实例创建一个BitmapData对象,该对象将永远不会消失,直到您对旧对象进行dispose()处理,等等。这是错误的,如果BitmapData对象本身符合垃圾收集的条件(不引用该条件),它迟早会被内存释放。调用BitmapData.dispose()不是“必须”。如果要立即释放内存,可以调用它。我尝试了temp.dispose();从中创建位图(myBitmap:bitmap=new bitmap(temp);)但这也会破坏位图…对不起,我在AS3方面不是很有经验。哦,对不起,是的-这是用于处理特定的BitmapData对象时。当您仍要使用它时不要进行处理-当您不再使用它时进行处理。例如,如果您多次重新加载同一图像,则可能会丢失为每个实例创建一个BitmapData对象,该对象将永远不会消失,直到您对旧对象进行dispose()处理,等等。这是错误的,如果BitmapData对象本身符合垃圾收集的条件(不引用该条件),它迟早会被内存释放。调用BitmapData.dispose()不是必须的。如果您想立即释放内存,可以调用它。