Есть ли способ очистить встроенные растровые активы в AS3 / AIR? - PullRequest
3 голосов
/ 15 марта 2012

впервые публикуется здесь.

Я создаю приложение AIR 3.0.

Для большинства моих графических ресурсов я использую метаданные Flex для встраивания растровых объектов в виде классов, а затем их создания.

Проблема в том, что кажется, что они никогда не собирают мусор. Я не нашел много информации в Интернете, но я видел пару постов, которые, кажется, подтверждают это.

Каждый раз, когда создается экземпляр одного из моих классов с этими встроенными активами, они всегда создают новые экземпляры растровых изображений и растровых данных, а не повторно используют то, что уже находится в памяти. Это огромная проблема для памяти. И я не могу найти какой-либо способ отменить их ссылку или заставить их оставить память.

Так что единственное решение, которое я могу придумать, это просто загрузить графику с диска, а не использовать тег для встраивания. Но я бы предпочел не делать этого, видя, как, когда приложение упаковано и установлено, все эти графические ресурсы будут находиться на компьютере конечного пользователя, а не содержаться в SWF.

Кто-нибудь сталкивался с этим? Есть решение? Или альтернативное решение, которое я не могу придумать?

Спасибо! Kyle

Ответы [ 2 ]

1 голос
/ 15 марта 2012

Ну, я думаю, это ожидаемое поведение, потому что новый оператор всегда должен создавать новые объекты. Но эти новые объекты должны собираться мусором, просто класс активов не будет, так как это класс.

Вы можете создать кеш, который действует как одноэлементная фабрика. Вы запрашиваете свое изображение, указывая идентификатор, и кеш затем создает это изображение, если оно еще не существует, или просто возвращает единственный экземпляр, если оно существует. Прошло много времени с тех пор, как я последний раз кодировал ActionScript, поэтому, возможно, вам следует воспринимать это как псевдокод;)

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

}

Вы можете использовать его так:

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

}

Я не проверял это, поэтому дайте мне знать, если это работает.

0 голосов
/ 16 марта 2012

Я думаю, что вы ищете dispose () 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.

...