2

我正在做一个应用程序,它将大量的精灵放在屏幕上随机位置,就像在桌子上扔纸牌一样,但过了一段时间它开始降低 fps,因为所有的精灵仍在消耗资源。我想做的是添加精灵,但就像一个图像,而不是重新绘制它们。有没有办法做到这一点?

代码如下所示:

var mySprite:MySprite = new MySprite();
mySprite.x = random;
mySprite.y = random;
mySprite.rotation = random;
addChild(mySprite);

Ps:他们出现在屏幕上之后,我就不必再惹他们了。

4

3 回答 3

1

我认为cacheAsBitmap您正在寻找的是:http: //help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/DisplayObject.html#cacheAsBitmap

var mySprite:MySprite = new MySprite();
mySprite.x = random;
mySprite.y = random;
mySprite.rotation = random;
mySprite.cacheAsBitmap = true;
addChild(mySprite);

值得仔细阅读文档,并用谷歌搜索一下:将 Sprite 缓存为位图并不一定在所有情况下都能提供更好的性能。

于 2012-09-13T15:39:01.013 回答
1

如果您不必弄乱,您可能会希望拥有一个 Bitmap 对象而不是许多 Sprite,而不是作为孩子添加,而是在该 Bitmap 的 bitmapData 上绘制()它们,然后丢弃。一个例子:

var mySprite:Sprite=new MySprite();
var myMat:Matrix=new Matrix();
for (i=100;i;i--) {
    myMat.identity();
    myMat.rotate(myRandom());
    myMat.translate(myRandom(),myRandom()); // set correct randoms here
    myBitmap.bitmapData.draw(mySprite,myMat);
}

有了这个,你会收到一个 Bitmap,上面有 100 个相同的 MySprite。mySprite如果您的 MySprite 类在其构造函数中具有随机性,您也可以每次都重新实例化变量。

于 2012-09-13T15:52:50.547 回答
1

看看这篇很棒的文章
我对其进行了一些更改,它返回一个精灵,而不是一个。

您可以在文章中阅读更多内容,但是这个类基本上是获取资产位图数据,并将其缓存到一个对象中。每当您需要该资产的其他实例时,您都会获得缓存的位图数据。使用此技术时,您可以提高很多,将舞台质量设置为 low
这种技术比简单地使用 cacheAsBitmap 更好,因为您可以使用 Sprite 而不是平面位图,同时仍然具有缓存的位图数据。

    public class CachedSpriteFactory
    {
        //Declare a static data cache
        protected static var cachedData:Object = {};        
        public static var clip:Bitmap;

        public function cacheSprite(asset:Object, scale:int = 2):Sprite
        {
            //Check the cache to see if we've already cached this asset
            var data:BitmapData = cachedData[getQualifiedClassName(asset)];
            if (!data)
            {
                var instance:Sprite = new asset();
                var bounds:Rectangle = instance.getBounds(this);

                //Optionally, use a matrix to up-scale the vector asset, this way you can increase scale later and it still looks good.
                var m:Matrix = new Matrix();
                m.translate(-bounds.x, -bounds.y);
                m.scale(scale, scale);              
                data = new BitmapData(bounds.width * scale, bounds.height * scale, true, 0x0);              
                data.draw(instance, m, null, null, null, true);
                cachedData[getQualifiedClassName(asset)] = data;
            }

            clip = new Bitmap(data, "auto", true);
            //Use the bitmap class to inversely scale, so the asset still appear to be it's normal size
            clip.scaleX = clip.scaleY = 1/scale;
            var sprite:Sprite = new Sprite();
            sprite.addChild(clip);
            //Optimize mouse children
            sprite.mouseChildren = false;

            return sprite;
        }
    }

用法:

stage.quality = StageQuality.HIGH
var cacheFactory:CachedSpriteFactory = new CachedSpriteFactory();
var coolSprite1:Sprite = cacheFactory.cacheSprite(SpriteLinkageNameInLibrary, 1);
var coolSprite2:Sprite = cacheFactory.cacheSprite(SpriteLinkageNameInLibrary, 1);
stage.quality = StageQuality.LOW
于 2012-09-13T18:41:34.180 回答