![]() |
|
||||||||||
|
|||||||
|
.
|
Всем привет! Пару дней сидел без интернета.
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Вышли мы из функции, ссылка пропала. Цитата:
Дальше расскажу что происходит с loader при загрузке растровых изображений (JPEG, PNG, GIF). Эксперимент проводился с Adobe Flash Player 10.0 r45 debug. Результат исследований заставил задуматься. Пока существует ссылка на BitmapData контента (loader.content as Bitmap).bitmapData, (loaderInfo.content as Bitmap).bitmapData, жив и лоадер. Можно даже сделать ей dispose(), ничего не изменится. Скажу больше. Даже bitmapData.clone() не позволит удалиться лоадеру. Однако после bitmapData.draw() GC может удалить Loader. Код маленького эксперимента /////////////////////////////////////////////////////////////////////////////// // // Copyright (C) 2011. Dimarik // /////////////////////////////////////////////////////////////////////////////// package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Loader; import flash.display.LoaderInfo; import flash.display.Sprite; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.events.Event; import flash.events.IEventDispatcher; import flash.net.URLRequest; /** * @author Dimarik * @version 1.0 * @langversion 3.0 * @playerversion 9.0 * */ [SWF(width="400", height="200", frameRate="21", backgroundColor="#E0EEEE")] public class LoaderTest extends Sprite { //------------------------------------------------------------------------- // // Constructor // //------------------------------------------------------------------------- public function LoaderTest() { super(); super.addEventListener(Event.ADDED_TO_STAGE, this.initialize); } //------------------------------------------------------------------------- // // Private methods // //------------------------------------------------------------------------- private var _bitmapData: BitmapData; //------------------------------------------------------------------------- // // Private methods // //------------------------------------------------------------------------- public function initialize(event:Event):void { (event.target as IEventDispatcher).removeEventListener(event.type, arguments.callee); super.stage.scaleMode = StageScaleMode.NO_SCALE; super.stage.align = StageAlign.TOP_LEFT; var url: String = 'http://www.flasher.ru/forum/image.php?u=69797&dateline=1296252938'; var request: URLRequest = new URLRequest(url); var loader: Loader = new Loader(); loader.load(request); var li: LoaderInfo = loader.contentLoaderInfo; li.addEventListener(Event.COMPLETE, this.handler_complete); } //------------------------------------------------------------------------- // // Events handlers // //------------------------------------------------------------------------- /** * @private * В таком виде в методе не произойдет удаление Loader */ private function handler_complete(event:Event):void { var li: LoaderInfo = event.target as LoaderInfo; var loader: Loader = li.loader; trace(li.contentType); // Раскомментируйте, чтобы проверить, что отписывание не влияет на решение GC об удалении loader //li.removeEventListener(Event.COMPLETE, this.handler_complete); var bitmap: Bitmap = loader.content as Bitmap; var bitmapData: BitmapData = bitmap.bitmapData; // Дублирование исходной BitmapData не влияет на лоадер. Он будет жить. var bitmapData2: BitmapData = bitmapData.clone(); // Однако draw не обладает такой силой. // Раскомментируйте, чтобы проверить, что в этом случае лоадер будет удален /* var bitmapData2: BitmapData = new BitmapData(bitmapData.width, bitmapData.height); bitmapData2.draw(bitmap); */ bitmap = new Bitmap(bitmapData2); // Пока есть ссылка на bitmapData, лоадер не будет удален. Закомментируйте для удаления лоадера. this._bitmapData = bitmapData2; // Пока используется оригинальная bitmapData или раздупленная через clone() лоадер будет жить. //super.addChild(bitmap); loader.unloadAndStop(); } } } |
![]() |
Часовой пояс GMT +4, время: 04:48. |
|
|
« Предыдущая тема | Следующая тема » |
|
|