![]() |
|
||||||||||
|
|||||
|
Регистрация: Jul 2005
Сообщений: 154
|
Вот этот delete:
delete (reference); ? Или какой-то другой? |
|
|||||
|
Регистрация: Jun 2005
Адрес: в Питере
Сообщений: 981
|
Есть еще одна полезность заставляющая отказаться от onClipEvent. Это область видимости переменных. Если мы запишем такой код в главной временной шкале,
То можем убедиться, что наша переменная замечательно видна. А если мы наш энтерфрейм запишем вот так: То наша переменная, если она определена вне клипа просто так не найдется, нужно будет писать что-то типа trace(_root.myVar); или trace(this._parent.myVar); чтобы флэш ее нашел. Таким образом определив функцию вне клипа к которому мы ее прилепляем, мы обеспечиваем область видимости переменных как той временной шкалы, где определяем функцию, так и переменных принадлежащей временной шкале клипа из которого будем эту функцию вызывать, которые будут видны как this.myVar . Конечно может это и не очень хорошо заставлять флэш просматривать все доступные области видимости, вместо того, чтобы указать ему конкретный путь, но зачастую это удобно! --а удалять обрабочик onEnterFrame(равно как и все остальные функции) мона так: или так: В последнем случае мы его не удаляем, а просто делаем его пустым, то есть он есть, но не содержит ничего, а следовательно и не выполняется.
__________________
Делай всё быстро, но не торопись!.._/*o|o*\_. |
|
|||||
|
Et cetera
Регистрация: 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
}
з.Ы. И не смотрите на значения чисел в цикле. з.Ы.Ы. В примере установлено 120 fps. Последний раз редактировалось etc; 14.05.2006 в 15:18. |
|
|||||
|
Регистрация: Jun 2005
Адрес: в Питере
Сообщений: 981
|
Цитата:
Цитата:
Цитата:
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;
};
__________________
Делай всё быстро, но не торопись!.._/*o|o*\_. |
|
|||||
|
Регистрация: Nov 2004
Адрес: Санкт-Петербург
Сообщений: 751
|
2 ETC, странный у тебя какой то тест... Я его себе скопипастил, запустил... а он просто повесил плейер... Ты его хоть тестировал?
По поводу присвоение null или delete, насколько я понимаю, это одно и тоже, в первом случае объект напрямую помечается для удаление сборщиком мусора, во втором, при очередном проходе, сборщик найдя нулевой указатель сам удалит объект. С учётом того, что сборщик мусора проходит с определённым периодом, вряд ли в случае delete объект будет удалён раньше...
__________________
Всё гениальное просто. |
|
|||||
|
Регистрация: 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);
__________________
Всё гениальное просто. Последний раз редактировалось Homo Sapiens; 15.05.2006 в 09:16. |
|
|||||
|
Регистрация: Nov 2004
Адрес: Санкт-Петербург
Сообщений: 751
|
Разница получается минимальная. Ради интереса можно закомментить test.clear();
__________________
Всё гениальное просто. |
|
|||||
|
Et cetera
Регистрация: 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" Даже если не подписан, всё равно у клипа есть переменная, которая в любом случае отжирает память. А вот результат с delete: Movie Clip: Target="_level0.test_6815mc" Movie Clip: Target="_level0.test_6816mc" Movie Clip: Target="_level0.test_6817mc" Функцию нужно убить, если она вам не нужна, в просто так забивать null-ем память лишний раз не стоит. Кто-то скажет, что мол, такого количества объектов врядли у кого-то будет (а падение производительности в два раза ощутимо). Согласен, но если часть onEnterFrame выполняет сложные вычисления, а другая часть просто отжирает процессорное время, ничего не делая, то потом можно не удивляться, почему тормозит... Последний раз редактировалось etc; 15.05.2006 в 13:32. |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Homo Sapiens, а что иллюстрирует твой пример? У тебя один объект, после выполнения действий ты или удаляешь или присваиваешь null функции. Но count тут причём? С одним объектом разница между null и delete не ощутима в плане производительности (тем не менее, в памяти остаётся onEnterFrame, если использовать null)
|
![]() |
![]() |
Часовой пояс GMT +4, время: 20:44. |
|
|
« Предыдущая тема | Следующая тема » |
|
|