Показать сообщение отдельно
Старый 08.06.2007, 14:29
MyXus вне форума Посмотреть профиль Отправить личное сообщение для MyXus Посетить домашнюю страницу MyXus Найти все сообщения от MyXus
  № 2  
Ответить с цитированием
MyXus
 
Аватар для MyXus

Регистрация: Mar 2001
Адрес: msk
Сообщений: 1,416
Ну что же. Три дня мучений и пару штук я нашел.
Про netConnection наверное все знают? Ну кто не знает:
Код:
var a:NetConnection = ...;
a.connect(...);
a.call('...', a); a.onResult = function(infoObj:Object) {};
Вот эта конструкция при большом количестве вызовов a.call('...', a); здорово жрет память и проц. Решение - просто скидывать NetConnection и генерить новый.

Но это простой баг, я его давно нашел. А самый крутой - вот:
Вот эта конструкция не дает утечек памяти
Код:
setInterval(function() { var c = 0; if(c) { var a = 1; } else { z = 2; } }, 30);
А вот эта - дает!
Код:
setInterval(function() { if(0) { var a = 1; } else { z = 2; } }, 30);
И причем дает дохрена.
Аналогичным образом, эта конструкция тоже течет
Код:
_root.ff = function() { };
setInterval(function() { _root.ff(); }, 30);
ну и эта тоже... понятно.
Код:
setInterval(function() { function() { }, 30);
Чтобы победить утечки в этих конструкциях, нужно, чтобы в периодически вызываемой функции обязательно происходили хоть какие-нибудь вычисления. Хотя бы и после return (!!!). Например:
Код:
mc.onEnterFrame = function(){return;};
будет течь, а
Код:
mc.onEnterFrame = function(){return; _root.aabbcc = 1; };
не будет! (вот пипец)

Дальше - не менее круто. Периодические функции, вызываемые через Delegate.create будут течь в любом случае!! Привет всем любителям делегирования от компании macromedia.

Также обнаружил что обращение к MovClip.filters внутри периодически вызываемой функции тоже течет.

Мои муки с memory leaks в самом разгаре, вполне возможно что список дополнится -)


Последний раз редактировалось MyXus; 08.06.2007 в 14:32.