この素晴らしい記事を見てください。
スプライトではなく、スプライトを返すようにいくつかの変更を加えました。
詳細は記事で読むことができますが、このクラスは基本的にアセットのビットマップ データを取得し、それをオブジェクトにキャッシュします。そのアセットの他のインスタンスが必要なときはいつでも、キャッシュされたビットマップ データを取得します。このテクニックを使用して、ステージの品質を低に設定すると、さらに改善できます。
この手法は、単純に 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