|
|
|||||
Ручной подсчет ссылок
Всем hola!
Что имеем: - хранилище ресурсов - запакованные ресурсы (свой компактный формат) - распакованные ресурсы (тупо наборы битмап) - ресурсы для тех, кто их использует, доступны по URL (условно bundle.getAsset("http://...")) Что хотелось бы: - в запакованном виде все ресурсы всегда доступны - распакованные ресурсы доступны только если они используются То есть фактически хотелось бы знать, сколько объектов используют ресурс, и, если таких объектов ровно 0 (zero), то удалить распакованный ресурс из памяти и ждать обращения по URL для распаковки и выдачи. Уже в общем-то есть идеи как это реализовать, но хотелось бы услышать Ваше мнение. Идеи - welcome!
__________________
...вселенская грусть |
|
|||||
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
У нас (не на флэш) без загрузки/выгрузки текстур подобным образом - нельзя, используем.
По-моему там всё очевидно. У ресурса есть счётчик ссылок, при добавлении увеличивается и грузится если был 0, при удалении уменьшается, выгружается, если стал 0. Ну т.к. нет деструкторов, то возможно надо внимательнее следить за выгрузкой, но удаление-то будет так или иначе, не думаю что вообще есть разница %)
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. |
|
|||||
Ну в общем одной из идей и было передавать "умный указатель", который бы при разрушении (кастомный деструктор, вызываемый внутри деструктора объекта, ссылающегося на ресурс) сигнализировал бы о нуле ссылок в случае чего.
Хочется как-то через словарь со слабыми ссылками. Ну и лексус еще хочется.
__________________
...вселенская грусть |
|
|||||
Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
|
Особо извращенный вариант (просьба ногами не запинывать):
public class ResourceProvider { public function ResourceProvider() { // Init resource list this._resHashtable = new Object(); this._resHashtable["resource001"] = new Bitmap(); this._resHashtable["resource002"] = new Bitmap(); this._resHashtable["resource003"] = new Bitmap(); this._resHashtable["resource004"] = new Bitmap(); this._resPtrRefs = new Dictionary(true); // Validate ptrs setInterval(this._validatePtrs, 1000); } private var _resHashtable : Object; private var _resPtrRefs : Dictionary; public function getResourcePointer( id:String ) : ResourcePointer { if (!(id in this._resHashtable)) return null; var ptr:ResourcePointer = new ResourcePointer(id, this); this._resPtrRefs[ptr] = true; return ptr; } internal function getResourceById( id:String ) : Object { return this._resHashtable[id] as Object; } private function _validatePtrs( ...args ) : void { var count:int = 0; for (var p:Object in this._resPtrRefs) count++; if (count == 0) this._destroy(); } private function _destroy() : void { // TODO destroy here } } public class ResourcePointer { public function ResourcePointer( id:String, provider:ResourceProvider ) { this._id = id; this._provider = provider; } private var _id : String; private var _provider : ResourceProvider; public function getResource() : Object { return this._provider.getResourceById(this._id); } }
__________________
Загружаем картинки, минуя ошибки безопасности Последний раз редактировалось i.o.; 11.03.2012 в 02:24. |
Часовой пояс GMT +4, время: 18:12. |
|
« Предыдущая тема | Следующая тема » |
|
|