![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Dec 2007
Сообщений: 269
|
Цитата:
2 akerka Панику разводить не надо )). Все нормально )). Просто код в кадрах в более-менее серьезном проекте действительно не дело. Пишите классами и будет вам щастье )). Проблема действительно в addFrameScript. А если уж так приперло выгружать ролик с кодом в кадрах, придется его убрать из кадров для начала тем же вызовом addFrameScript. Пример: Вставить в исходник из первого поста перед вызовом unload(), и все почистится нормально. |
|
|||||
|
Регистрация: Apr 2006
Сообщений: 36
|
Проблема не в addFrameScript, по крайней мере не только в нем. Выдержка из документации:
"As a best practice, before you unload a child SWF file, you should explicitly close any streams in the child SWF file's objects, such as LocalConnection, NetConnection, NetStream, and Sound objects. Otherwise, audio in the child SWF file might continue to play(Это о моем случае), even though the child SWF file was unloaded. To close streams in the child SWF file, add an event listener to the child that listens for the unload event. When the parent calls Loader.unload(), the unload event is dispatched to the child. Что касается GC о из приведенной где то выше презентации выходит что GC вообще не гарантирует повторного использования участков памяти, поэтому это трудно даже назвать утечкой. Как затереть код в кадре - идея хорошая. А писать или нет код для кадра - это из области флуда, я понял. Если заморачиваться и отказываться от таймлайна в пользу только программной анимации, тогда еще можно. А иначе - никак. Последний раз редактировалось akerka; 23.02.2008 в 01:43. |
|
|||||
|
Регистрация: Dec 2007
Сообщений: 269
|
Проблема именно в addFrameScript, в данном конкретном случае. Вроде бы доказательства приведены, что еще не нравится?
То что потоки надо закрывать, и про это написано в хелпе мне известно, да и на форуме это уже обсуждалось. Только это не имеет никакого отношения к данной теме. |
|
|||||
|
Регистрация: Apr 2006
Сообщений: 36
|
а почему тогда проблему предлагается решить с помощью:
Который по видимому просто сбрасывает какую то сетевую активность? Мне все нравится, ведь я нашел решение своему случаю этой проблемы. |
|
|||||
|
Регистрация: Jan 2002
Адрес: asd
Сообщений: 85
|
Ах! сборщик мусора!
Я почти понял проблема в чём. Flash Player состоит из двух основных частей: 1. Виртуальная машина ActionScript (ActionScript Virtual Machine, AVM). 2. Устройство рендеринг (Rendering Engine). Они (обе части) функционируют совместно, образуя единое целое. AVM отвечает за выполнение кода ActionScript, а устройство рендеринг отрисовывает объекты на экране. Удаление отображаемого объекта из устройства рендеринга осуществляется соответствующими методами (removeChild,removeChildAt, unload). Теперь на экране его нет, но пока существует в AVM. Удаляем его из AVM: Теперь его нет ( ни в AVM и ни в устройстве рендеринга ). Однако в памяти пока он существует, поскольку с ним ассоцирован код, записываемый в его кадре ( кадр загружаемого SWF ). В этом случае CG не будет работать. Чтобы заставить его работать, используйте мой следующий класс. Я уверен, что он вам поможет в таких ситуациях: package {
import flash.events.TimerEvent;
import flash.system.System;
import flash.utils.Timer;
public class MySystemGC {
static private var _gc:MySystemGC;
private var _timer:Timer;
public function MySystemGC() {
_timer = new Timer ( 10, 10 );
_timer.addEventListener( TimerEvent.TIMER, onTimer );
_timer.start();
}
private function onTimer ( e:TimerEvent ) :void {
System.gc();
}
static public function gc ( ) :void {
_gc = new MySystemGC ( );
}
}
}
__________________
время никого не ждёт. |
|
|||||
|
Регистрация: Dec 2007
Сообщений: 269
|
А для не дебаговой версии как-раз используется
вместо System.gc(); |
|
|||||
|
Регистрация: Jan 2002
Адрес: asd
Сообщений: 85
|
Почему только в дебаговой версии?!
Во Flex Builder 3 работает и в режиме Debug и Run.
__________________
время никого не ждёт. |
|
|||||
|
сори, я почему удалил свой коммент:
у меня теперь твоя конструкция совсем не работает: не удаляется стримовый звук, даже и в дебаговой версии надо разбираться.. UPD: так и try {
new LocalConnection().connect('gcForce');
new LocalConnection().connect('gcForce');
} catch (err:*) {}
гружу swf, в котрром шейп (для контроля) и звук (Stream).. не удаляет.. ![]() Последний раз редактировалось silin; 23.02.2008 в 03:33. |
|
|||||
|
Регистрация: Jan 2002
Адрес: asd
Сообщений: 85
|
Попробуйте ( с помощью LocalConnection ):
package {
import flash.net.LocalConnection;
import flash.display.MovieClip;
import flash.events.Event;
import flash.text.TextField;
public class Example extends MovieClip {
private var _mc:MovieClip;
private var _txt:TextField;
private var _count:uint;
public function Example () {
_mc = new MovieClip ( );
_mc.x = _mc.y = 300;
_mc.graphics.beginFill( 0xFF );
_mc.graphics.drawCircle( 0, 0, 20 );
_mc.graphics.endFill();
_mc.addEventListener( Event.ENTER_FRAME, onEnterFrame );
addChild ( _mc );
_txt = new TextField ( );
_txt.text = "Hello";
addChild ( _txt );
_count = 0;
}
private function onEnterFrame ( e:Event ) :void {
_count++;
_txt.text = String (_count);
if ( _count == 100 ) {
removeChild ( _mc );
_mc = null;
try {
new LocalConnection().connect('gcForce');
new LocalConnection().connect('gcForce');
} catch (err:*) {}
}
}
}
}
__________________
время никого не ждёт. |
|
|||||
|
Регистрация: Jan 2002
Адрес: asd
Сообщений: 85
|
сначала надо остоновить потоковую загрузку звука ( close() ), потом удалить.
__________________
время никого не ждёт. |
![]() |
![]() |
Часовой пояс GMT +4, время: 13:52. |
|
|
« Предыдущая тема | Следующая тема » |
|
|