2

テーブルにカードを投げるように、画面に大量のスプライトをランダムな位置に配置するアプリケーションを実行していますが、すべてのスプライトがまだリソースを消費しているため、しばらくすると fps が低下し始めます。私がやりたいのは、スプライトを追加することですが、再描画せずに画像のようにします。とにかくそれを行うことはありますか?

コードは次のようになります。

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

Ps: 画面に表示された後は、それらをいじる必要はありません。

4

3 に答える 3

1

この素晴らしい記事を見てください。
スプライトではなく、スプライトを返すようにいくつかの変更を加えました。

詳細は記事で読むことができますが、このクラスは基本的にアセットのビットマップ データを取得し、それをオブジェクトにキャッシュします。そのアセットの他のインスタンスが必要なときはいつでも、キャッシュされたビットマップ データを取得します。このテクニックを使用して、ステージの品質を低に設定すると、さらに改善できます。
この手法は、単純に cacheAsBitmap を使用するよりも優れています。キャッシュされたビットマップ データを保持しながら、フラット ビットマップの代わりにスプライトを使用できるからです。

    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 に答える
1

混乱する必要がない場合は、多くのスプライトの代わりに Bitmap オブジェクトを使用することを検討し、子として追加する代わりに、その Bitmap の bitmapData に対してそれらを draw() して破棄します。例:

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

これにより、100 個の同一の MySprites が描画された単一のビットマップを受け取ります。MySprite クラスのコンストラクターでランダム化が行われている場合は、mySprite毎回変数を再インスタンス化することもできます。

于 2012-09-13T15:52:50.547 に答える
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);

ドキュメンテーションを注意深く読んで、少しグーグルで検索する価値があります。スプライトをビットマップとしてキャッシュすると、すべての場合でパフォーマンスが向上するとは限りません。

于 2012-09-13T15:39:01.013 に答える