2012-03-15 9 views
3

初めてここに投稿します。AS3/AIRの埋め込みビットマップアセットをクリアする方法はありますか

私はAIR 3.0アプリケーションを作成しています。

多くの私のグラフィカルアセットでは、ビットマップオブジェクトをクラスとして埋め込み、インスタンス化するためにFlex埋め込みメタデータを使用しています。

問題は、これらがガベージコレクションを取得しないと思われることです。私は多くの情報をオンラインで見つけたわけではありませんが、私はこれを確認するようないくつかの投稿を見ました。

これらの組み込みアセットを持つクラスがインスタンス化されるたびに、常にメモリ内のものを再利用するのではなく、ビットマップとビットマップデータの新しいインスタンスが作成されます。これはメモリにとって大きな問題です。そして、私はそれらを逆参照したり、彼らに記憶を残させるような方法を見つけることはできません。

私が考えることができる唯一の解決策は、埋め込みタグを使用するのではなく、ディスクからグラフィックスを読み込むことです。しかし、私はむしろ、アプリケーションがパッケージ化されてインストールされるとき、どのようにこれらのグラフィックアセットがSWF内に含まれるのではなく、エンドユーザのコンピュータ上にあるかを見ていないだろう。

Anyoenこれに実行しますか?解決策はありますか?または、私が考えることができるものとは別の解決策ですか?

ありがとうございます! Kyle

答えて

1

新しいオペレータは常に新しいオブジェクトを作成する必要があるので、これは予想される動作だと思います。しかし、これらの新しいオブジェクトはガベージコレクトされるべきであり、それはクラスであるため、アセットクラスだけは収集しません。

シングルトンファクトリのように動作するキャッシュを構築できます。 IDを指定してイメージを要求した場合、キャッシュはイメージがまだ存在しない場合は作成するか、存在する場合は単一のインスタンスを返すだけです。

public class Example { 

    public static function main() { 
     Bitmap exampleGif1 = Cache.getInstance().getAsset("ExampleGif") as Bitmap; 
     Bitmap exampleGif2 = Cache.getInstance().getAsset("ExampleGif") as Bitmap; 
     trace("both should be the same instance: " + (exampleGif1 == exampleGif2)); 
    } 

} 

私はこれをテストしていない:あなたはこのようにそれを使用することができます)

public class Cache { 

    import flash.utils.Dictionary; 
    import flash.utils.getDefinitionByName; 

    [Embed(source="example.gif")] 
    public static var ExampleGif:Class; 

    /** 
    * The single instance of the cache. 
    */ 
    private static var instance:Cache; 

    /** 
    * Gets the Cache instance. 
    * 
    * @return 
    *  The Cache 
    */ 
    public static function getInstance():Cache { 
     if (Cache.instance == null) { 
      Cache.instance = new Cache(); 
     } 
     return Cache.instance; 
    } 

    /** 
    * The cached assets are in here. 
    */ 
    private var dictionary:Dictionary 

    public function Chache() { 
     if (Cache.instance != null) { 
      throw new Error("Can not instanciate more than once."); 
     } 
     this.dictionary = new Dictionary(); 
    } 

    /** 
    * Gets the single instantiated asset its name. 
    * 
    * @param assetName 
    *  The name of the variable that was used to store the embeded class 
    */ 
    public function getAsset(assetName:String):Object { 
     if (this.dictionary[assetName] == null) { 
      var AssetClass = getDefinitionByName(assetName) as Class; 
      this.dictionary[assetName] = new AssetClass(); 
     } 
     return this.dicionary[assetName]; 
    } 

} 

、私は最後のActionScriptをコード化されたので、それはので、多分あなたは擬似コードとしてこれを取る必要があり、しばらくしていますそれが動作するかどうか、私に知らせてください。あなたは、キャッシングシステムで行くことに決めた場合

0

は、私はあなたが探しているものだと思うが処分である()http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/BitmapData.html?#dispose()

は、ここhttp://thanksmister.com/2009/01/29/flex-imagecache-a-cheap-way-to-cache-images/をテストしていることをいくつかのコードとのリンクです。 SuperImageを使用した別のテクニックとのリンクは壊れていますが、私はこれを見つけることができましたhttp://demo.quietlyscheming.com/superImage/app.html

関連する問題