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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 13.05.2006, 21:24
Beta-tester вне форума Посмотреть профиль Отправить личное сообщение для Beta-tester Найти все сообщения от Beta-tester
  № 11  
Ответить с цитированием
Beta-tester

Регистрация: Jul 2005
Сообщений: 154
Вот этот delete:
delete (reference); ?
Или какой-то другой?

Старый 13.05.2006, 21:26
Nirth вне форума Посмотреть профиль Отправить личное сообщение для Nirth Посетить домашнюю страницу Nirth Найти все сообщения от Nirth
  № 12  
Ответить с цитированием
Nirth
4AM Games
 
Аватар для Nirth

блогер
Регистрация: Nov 2002
Адрес: Sofia
Сообщений: 6,264
Записей в блоге: 1
Отправить сообщение для Nirth с помощью ICQ Отправить сообщение для Nirth с помощью AIM Отправить сообщение для Nirth с помощью MSN Отправить сообщение для Nirth с помощью Yahoo Отправить сообщение для Nirth с помощью Skype™
в хелпе только один delete
__________________
Я перестал переписывать, начал редактировать, еще лет 15 и я стану писателем ^_^

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

Регистрация: Jun 2005
Адрес: в Питере
Сообщений: 981
Есть еще одна полезность заставляющая отказаться от onClipEvent. Это область видимости переменных. Если мы запишем такой код в главной временной шкале,
Код:
var myVar = 'ok';
myClip.onEnterFrame = function() {
	trace(myVar);
};
То можем убедиться, что наша переменная замечательно видна. А если мы наш энтерфрейм запишем вот так:
Код:
onClipEvent (enterFrame) {
	trace(myVar);
}
То наша переменная, если она определена вне клипа просто так не найдется, нужно будет писать что-то типа trace(_root.myVar); или trace(this._parent.myVar); чтобы флэш ее нашел. Таким образом определив функцию вне клипа к которому мы ее прилепляем, мы обеспечиваем область видимости переменных как той временной шкалы, где определяем функцию, так и переменных принадлежащей временной шкале клипа из которого будем эту функцию вызывать, которые будут видны как this.myVar . Конечно может это и не очень хорошо заставлять флэш просматривать все доступные области видимости, вместо того, чтобы указать ему конкретный путь, но зачастую это удобно!

--а удалять обрабочик onEnterFrame(равно как и все остальные функции)
мона так:
Код:
delete onEnterFrame;
или так:
Код:
onEnterFrame=null
В последнем случае мы его не удаляем, а просто делаем его пустым, то есть он есть, но не содержит ничего, а следовательно и не выполняется.
__________________
Делай всё быстро, но не торопись!.._/*o|o*\_.

Старый 14.05.2006, 15:15
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 14  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Насчёт "не выполняется" есть некоторое сомнение, но проверить на практике можно вот так:
Код:
this.createTextField("fps_txt", 0, 10, 10, 100, 20);
fps = 0;
clearFPS = function () {
	fps_txt.text = fps;
	fps = 0;
};
onEnterFrame = function () {
	fps++;
};
setInterval(clearFPS, 1000);
for (var i = 0; i<10000; i++) {
	var mc = this.createEmptyMovieClip("test_"+i+"mc", i+1);
	mc.onEnterFrame = function () {
		this._x++;	
	};
	
}
for (var i=0;i<10000;i++) {
	var mc = this['test_'+i+'mc'];
	mc.onEnterFrame = null; // 55-65 fps
	//delete mc.onEnterFrame; // 100-125 fps
}
Вывод: используйте delete.

з.Ы. И не смотрите на значения чисел в цикле.

з.Ы.Ы. В примере установлено 120 fps.


Последний раз редактировалось etc; 14.05.2006 в 15:18.
Старый 15.05.2006, 03:37
Madasan вне форума Посмотреть профиль Отправить личное сообщение для Madasan Найти все сообщения от Madasan
  № 15  
Ответить с цитированием
Madasan
 
Аватар для Madasan

Регистрация: Jun 2005
Адрес: в Питере
Сообщений: 981
Цитата:
Сообщение от ETC
Насчёт "не выполняется" есть некоторое сомнение, но проверить на практике можно вот так:
Имелось ввиду выполнение функции, которое нам хотелось бы прервать.
Цитата:
Сообщение от Madasan
В последнем случае мы его не удаляем, а просто делаем его пустым, то есть он есть, но не содержит ничего, а следовательно и не выполняется.
По тому что он есть, он и занимает ресурсы.
Цитата:
Сообщение от ETC
Вывод: используйте delete.
А вот насчет вывода есть сомнение. Если уж брать такие мегаколичества объектов, то можно также привести пример с обратным эффектом:
Код:
this.createTextField("fps_txt", 0, 10, 10, 100, 20);
for (var i = 0; i<10000; i++) {
	var mc = this.createEmptyMovieClip("test_"+i+"mc", i+1);
}
function enteRFrame() {
	this._x++;
}
onEnterFrame = function () {
	time = getTimer();
	for (var i = 0; i<10000; i++) {
		var mc = this['test_'+i+'mc'];
		//mc.onEnterFrame = null;
		delete mc.onEnterFrame;
		mc.onEnterFrame = enteRFrame;
	}
	fps_txt.text = getTimer()-time;
};
Когда мы полностью удалии объект, то если он нам еще раз понадобиться, его придется создавать заново, а это более напряжно, чем просто присвоить новое значение. Так что вывод можно сделать такой. Если нужно с достаточно большой частотой удалять и создавать этот самый онЭнерФрейм, то можно просто присваивать null, если же нужно освободить ресурс на какой-то промежуток времени или на совсем, то лучше использовать delete.
__________________
Делай всё быстро, но не торопись!.._/*o|o*\_.

Старый 15.05.2006, 08:44
Homo Sapiens вне форума Посмотреть профиль Отправить личное сообщение для Homo Sapiens Посетить домашнюю страницу Homo Sapiens Найти все сообщения от Homo Sapiens
  № 16  
Ответить с цитированием
Homo Sapiens
 
Аватар для Homo Sapiens

Регистрация: Nov 2004
Адрес: Санкт-Петербург
Сообщений: 751
2 ETC, странный у тебя какой то тест... Я его себе скопипастил, запустил... а он просто повесил плейер... Ты его хоть тестировал?

По поводу присвоение null или delete, насколько я понимаю, это одно и тоже, в первом случае объект напрямую помечается для удаление сборщиком мусора, во втором, при очередном проходе, сборщик найдя нулевой указатель сам удалит объект. С учётом того, что сборщик мусора проходит с определённым периодом, вряд ли в случае delete объект будет удалён раньше...
__________________
Всё гениальное просто.

Старый 15.05.2006, 09:03
Homo Sapiens вне форума Посмотреть профиль Отправить личное сообщение для Homo Sapiens Посетить домашнюю страницу Homo Sapiens Найти все сообщения от Homo Sapiens
  № 17  
Ответить с цитированием
Homo Sapiens
 
Аватар для Homo Sapiens

Регистрация: Nov 2004
Адрес: Санкт-Петербург
Сообщений: 751
Код:
var count = 0;
var inter;
var res = 1;

_root.onEnterFrame = function()
{
	count++;
}

function Stop()
{
	//delete test.onEnterFrame;
	test.onEnterFrame = null;
	trace(count);
	clearInterval(inter);
	Start();
	inter = setInterval(StopAll, 5000);
}

function StopAll()
{
	clearInterval(inter);
	trace(count);
	trace(res);
	delete _root.onEnterFrame;
}

var test = this.createEmptyMovieClip("test", 1);
test._x = 300;
test._y = 300;
test.onEnterFrame = function()
{
	res += Math.round(Math.random() * Math.cos(Math.random())) - Math.exp(Math.random());
	test._rotation += 0.70;
	test.clear();
	test._alpha = random(100);
	test.lineStyle(1, 0x000000, 100);
	test.beginFill(random(0xFFFFFF), 100);
	test.moveTo(0, 0);
	test.lineTo(0, 600);
	test.curveTo(630, 650, 510, 520);
	test.lineTo(0, 0);
}

inter = setInterval(Stop, 5000);
Частота кадров - 100
__________________
Всё гениальное просто.


Последний раз редактировалось Homo Sapiens; 15.05.2006 в 09:16.
Старый 15.05.2006, 09:18
Homo Sapiens вне форума Посмотреть профиль Отправить личное сообщение для Homo Sapiens Посетить домашнюю страницу Homo Sapiens Найти все сообщения от Homo Sapiens
  № 18  
Ответить с цитированием
Homo Sapiens
 
Аватар для Homo Sapiens

Регистрация: Nov 2004
Адрес: Санкт-Петербург
Сообщений: 751
Разница получается минимальная. Ради интереса можно закомментить test.clear();
__________________
Всё гениальное просто.

Старый 15.05.2006, 13:23
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 19  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Конечно тестил, надо было не прерывать.

Madasan, твой пример мне непонятен, this в функции enteRFrame куда ссылается? delete удаляет саму функцию из памяти, а не объект, который её содержит. Тем более, ты после удаления функции (которой ещё нет), присваиваешь ей значение и конечно же видишь тормоза. Я не вижу смысла удалять функцию перед тем, как заново ей присваивать значение. Как правило, если нужно остановить onEnterFrame, то останавливается он не на время выполнения двух строк кода, а на гораздо большее. Возможно, постоянно медленно работающее приложение тебя устроит больше, чем приложение, которое, хоть и подтормаживает при выполнении действий с onEnterFrame, но после их выполнения работает ощутимо быстрее...

null не удаляет функцию из памяти, это можно увидеть в trace:
Код:
Movie Clip: Target="_level0.test_5014mc"
Variable _level0.test_5014mc.onEnterFrame = null
Movie Clip: Target="_level0.test_5015mc"
Соответственно, если клип имеет у себя onEnterFrame, то значит он подписан на enterFrame, со всеми вытекающими...
Даже если не подписан, всё равно у клипа есть переменная, которая в любом случае отжирает память.

А вот результат с delete:
Код:
Movie Clip: Target="_level0.test_6815mc"
Movie Clip: Target="_level0.test_6816mc"
Movie Clip: Target="_level0.test_6817mc"
Комментировать не буду. Homo Sapiens, видна разница между delete и null?

Функцию нужно убить, если она вам не нужна, в просто так забивать null-ем память лишний раз не стоит.

Кто-то скажет, что мол, такого количества объектов врядли у кого-то будет (а падение производительности в два раза ощутимо). Согласен, но если часть onEnterFrame выполняет сложные вычисления, а другая часть просто отжирает процессорное время, ничего не делая, то потом можно не удивляться, почему тормозит...


Последний раз редактировалось etc; 15.05.2006 в 13:32.
Старый 15.05.2006, 13:28
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 20  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Homo Sapiens, а что иллюстрирует твой пример? У тебя один объект, после выполнения действий ты или удаляешь или присваиваешь null функции. Но count тут причём? С одним объектом разница между null и delete не ощутима в плане производительности (тем не менее, в памяти остаётся onEnterFrame, если использовать null)

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

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

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


 


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


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