0

私は cacheAsBitmap = true を持っています

そして次のクラス

package  utility{
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.Sprite;
    import flash.geom.Matrix;
    import flash.geom.Rectangle;
    import flash.utils.getQualifiedClassName;


    public class CachedSprite extends Sprite {
        //Declare a static data cache
        protected static var cachedData:Object = { };

        public var clip:Bitmap;

        public function CachedSprite(asset:Class, centered:Boolean = false, scale:int = 2) {
            //Check the cache to see if we've already cached this asset
            var data:BitmapData = cachedData[getQualifiedClassName(asset)];

            if (!data) {
                // Not yet cached. Let's do it now

                // This should make "Class", "Sprite", and "Bitmap" data types all work.
                var instance:Sprite = new Sprite();
                instance.addChild(new asset());

                // Get the bounds of the object in case top-left isn't 0,0
                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);

                // This shoves the data to our cache. For mobiles in GPU-rendering mode,
                // also uploads automatically to the GPU as a texture at this point.
                data = new BitmapData(instance.width * scale, instance.height * scale, true, 0x0);
                data.draw(instance, m, null, null, null, true); // final true enables smoothing
                cachedData[getQualifiedClassName(asset)] = data;
            }

            // This uses the data already in the GPU texture bank, saving a draw/memory/push call:
            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;

            addChild(clip);

            if (centered) {
                // If we want the clip to be centered instead of top-left oriented:
                clip.x = clip.width / -2;
                clip.y = clip.height / -2;
            }

            // Optimize mouse children
            mouseChildren = false;
        }

        public function kill():void {
            // Just in case you want to clean up things the manual way
            removeChild(clip);
            clip = null;
        }
    }
}

違いを説明できる人はいますか?cacheAsBitmap = true を使用するだけでなく、このクラスを実装する必要があるのはなぜですか? ありがとう

4

2 に答える 2

2

DisplayObject移動した場合の再描画を避けるために、cacheAsBitmapプロパティを設定できます。true に設定すると、Flash ランタイムは表示オブジェクトの内部ビットマップ表現をキャッシュします。

フィルターを表示オブジェクトに適用するたびに、cacheAsBitmap プロパティが自動的に true に設定されます。ほとんどが静的コンテンツで、アルファを頻繁に拡大縮小、回転、または変更しない表示オブジェクトでの使用に最適です。ビットマップ データは、水平方向または垂直方向の移動以外のすべての操作に対して再計算する必要があります。

ビットマップを自分でキャッシュすると、レンダリング ライフサイクルの制御が強化されます。

あなたのクラスでは、元の表示オブジェクトを追加するのでCachedSpriteはなく、表示リストに実際に追加されるのはです。入力デバイスとのやり取りBitmapはすべて、キャッシュされたスプライト インスタンスに適用する必要があります。

于 2012-10-26T03:49:12.487 に答える
1

主な違いは次の行にあるようです。

var data:BitmapData = cachedData[getQualifiedClassName(asset)];

このクラスは、以前にキャッシュされたビットマップへの静的参照を保持します。の 2 つのインスタンスがCachedSprite同じビットマップ データ (たとえば、パーティクルなど) を表示している場合、このクラスは の 1 つのインスタンスのみを使用しBitmapData、メモリを節約します。

于 2012-10-26T03:35:55.780 に答える