Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 23.02.2008, 01:25
badun вне форума Посмотреть профиль Отправить личное сообщение для badun Найти все сообщения от badun
  № 21  
Ответить с цитированием
badun

Регистрация: Dec 2007
Сообщений: 269
Цитата:
Сообщение от sultan_M
Не понял!
почему GC надо вызвать именно 4 раза?! и не подряд?!! . почему не работает с 1-ого вызова?!!!!
не 4 раза, а 2 - это я забыл лишний gc() убрать )). Два вызова gc() подряд последовательно в коде не работали.

2 akerka
Панику разводить не надо )). Все нормально )). Просто код в кадрах в более-менее серьезном проекте действительно не дело. Пишите классами и будет вам щастье )).
Проблема действительно в addFrameScript. А если уж так приперло выгружать ролик с кодом в кадрах, придется его убрать из кадров для начала тем же вызовом addFrameScript.
Пример:
Код:
(contentLoader.content as MovieClip).addFrameScript(0,null); // затираем trace() в 1м кадре
Вставить в исходник из первого поста перед вызовом unload(), и все почистится нормально.

Старый 23.02.2008, 01:34
akerka вне форума Посмотреть профиль Отправить личное сообщение для akerka Найти все сообщения от akerka
  № 22  
Ответить с цитированием
akerka
 
Аватар для akerka

Регистрация: 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.
Старый 23.02.2008, 01:41
badun вне форума Посмотреть профиль Отправить личное сообщение для badun Найти все сообщения от badun
  № 23  
Ответить с цитированием
badun

Регистрация: Dec 2007
Сообщений: 269
Проблема именно в addFrameScript, в данном конкретном случае. Вроде бы доказательства приведены, что еще не нравится?
То что потоки надо закрывать, и про это написано в хелпе мне известно, да и на форуме это уже обсуждалось. Только это не имеет никакого отношения к данной теме.

Старый 23.02.2008, 01:58
akerka вне форума Посмотреть профиль Отправить личное сообщение для akerka Найти все сообщения от akerka
  № 24  
Ответить с цитированием
akerka
 
Аватар для akerka

Регистрация: Apr 2006
Сообщений: 36
а почему тогда проблему предлагается решить с помощью:
Код:
try {new LocalConnection().connect('gcForce');
new LocalConnection().connect('gcForce');
} catch (err:*) {}
Который по видимому просто сбрасывает какую то сетевую активность? Мне все нравится, ведь я нашел решение своему случаю этой проблемы.

Старый 23.02.2008, 02:19
sultan_M вне форума Посмотреть профиль Отправить личное сообщение для sultan_M Найти все сообщения от sultan_M
  № 25  
Ответить с цитированием
sultan_M

Регистрация: Jan 2002
Адрес: asd
Сообщений: 85
Ах! сборщик мусора!
Я почти понял проблема в чём.
Flash Player состоит из двух основных частей:

1. Виртуальная машина ActionScript (ActionScript Virtual Machine, AVM).
2. Устройство рендеринг (Rendering Engine).

Они (обе части) функционируют совместно, образуя единое целое. AVM отвечает за выполнение кода ActionScript, а устройство рендеринг отрисовывает объекты на экране.

Удаление отображаемого объекта из устройства рендеринга осуществляется соответствующими методами (removeChild,removeChildAt, unload). Теперь на экране его нет, но пока существует в AVM. Удаляем его из AVM:

Код:
object = null;
Теперь его нет ( ни в 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 ( );
       }
    }
}
Пример:

Код:
// удалить из устройства рендеринга
removeChild ( _mc );
// удалить из AVM
_mc = null
// удалить из памяти
MySystemGC.gc();
__________________
время никого не ждёт.

Старый 23.02.2008, 03:12
badun вне форума Посмотреть профиль Отправить личное сообщение для badun Найти все сообщения от badun
  № 26  
Ответить с цитированием
badun

Регистрация: Dec 2007
Сообщений: 269
А для не дебаговой версии как-раз используется
Код:
//GC enforcing
try {
	new LocalConnection().connect('gcForce');
	new LocalConnection().connect('gcForce');
} catch (err:*) {}
вместо System.gc();

Старый 23.02.2008, 03:12
sultan_M вне форума Посмотреть профиль Отправить личное сообщение для sultan_M Найти все сообщения от sultan_M
  № 27  
Ответить с цитированием
sultan_M

Регистрация: Jan 2002
Адрес: asd
Сообщений: 85
Почему только в дебаговой версии?! Во Flex Builder 3 работает и в режиме Debug и Run.
__________________
время никого не ждёт.

Старый 23.02.2008, 03:21
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 28  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
сори, я почему удалил свой коммент:
у меня теперь твоя конструкция совсем не работает: не удаляется стримовый звук, даже и в дебаговой версии
надо разбираться..
UPD:
так и
Код:
try {
	new LocalConnection().connect('gcForce');
	new LocalConnection().connect('gcForce');
} catch (err:*) {}
не удаляет..
гружу swf, в котрром шейп (для контроля) и звук (Stream)..
не удаляет..


Последний раз редактировалось silin; 23.02.2008 в 03:33.
Старый 23.02.2008, 03:28
sultan_M вне форума Посмотреть профиль Отправить личное сообщение для sultan_M Найти все сообщения от sultan_M
  № 29  
Ответить с цитированием
sultan_M

Регистрация: 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:*) {}   		
        	}
        }
    }
}
обработчик все равно будет вызываться, а с помощью MySystemGC - всё в шоколаде

Код:
private function onEnterFrame ( e:Event ) :void {
        	_count++;
        	_txt.text = String (_count);
        	if ( _count == 100 ) {
        		removeChild ( _mc );
        		_mc = null; 		
        		MySystemGC.gc();
        	}
        }
__________________
время никого не ждёт.

Старый 23.02.2008, 03:31
sultan_M вне форума Посмотреть профиль Отправить личное сообщение для sultan_M Найти все сообщения от sultan_M
  № 30  
Ответить с цитированием
sultan_M

Регистрация: Jan 2002
Адрес: asd
Сообщений: 85
сначала надо остоновить потоковую загрузку звука ( close() ), потом удалить.
__________________
время никого не ждёт.

Создать новую тему Ответ Часовой пояс GMT +4, время: 13:04.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 13:04.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.