|
|
|||||
Регистрация: Jan 2004
Адрес: На чердаке.
Сообщений: 1,112
|
BitmapData & memory leaks
Случайно натолкнулся на такую вещь.
import flash.display.BitmapData; var bm:BitmapData; function createBitmap() { bm = new BitmapData(200, 200, false, 0xFF000000); } onEnterFrame = createBitmap; Во втором варианте наблюдаются некислая утечка памяти, которая периодически очищается коллектором. Фактически мы наблюдаем механизм очистки по меткам, но интересует другой вопрос - кто виноват и что делать, а точнее - если где-то создаются неявные или перекрестные ссылки на созданные экземпляры BitmapData, так что их приходится удалять по меткам, то почему этого не возникает в первом варианте?
__________________
...Тебе страшно? Мне - нет. |
|
|||||
Регистрация: Jan 2004
Адрес: На чердаке.
Сообщений: 1,112
|
Немного перефразирую вопрос. В первом случае как раз все понятно: в момент присваивания переменной bm нового объекта срабатывает механизм garbage collector'a очистки по ссылкам.
Но вот что происходит во втором случае, заставило меня ломать голову... Где, и каким макаром, остаются ссылки на созданные объекты, раз их приходится удалять по меткам???
__________________
...Тебе страшно? Мне - нет. |
|
|||||
Регистрация: Oct 2006
Адрес: spb.ru
Сообщений: 3,221
|
Во втором случае ссылок не остается, но битмапа где-то крепко сидит, если ее надо не delete а dispose..
|
|
|||||
Et cetera
Регистрация: Sep 2002
Сообщений: 30,784
|
В первом случае ты замещаешь старый битмап, а во втором постоянно создаешь новый битмап. Флеш плеер ставит некую отметку необходимого количества и переодически очищает память при превышении данной отметки (если, конечно, есть, что удалять).
|
|
|||||
Регистрация: Jan 2004
Адрес: На чердаке.
Сообщений: 1,112
|
Цитата:
delete удаляет ссылку на экземпляр. Если существуют другие ссылки - объект не удаляется. Собственно это мы и видим во втором примере. Если написать Утечка никуда не исчезает, и это значит, что действительно где-то есть еще ссылки. Вопрос - почему эти ссылки не возникают (или сразу удаляются) в варианте первом... Цитата:
И вопрос второй: если при замещении срабатывает механизм очистки по ссылкам, то почему он не срабатывает при выходе из функции createBitmap()?
__________________
...Тебе страшно? Мне - нет. |
|
|||||
Регистрация: Jan 2004
Адрес: На чердаке.
Сообщений: 1,112
|
А дальше, как говорила одна маленькая девочка из Зазеркалья - "Становится все страньше и страньше...."
Подобная хрень (назвать иначе язык не поворачивается) наблюдается в среде Flash8, но отсутствует во Flash9 (в том числе в альфе). Там никаких утечек. Далее еще интереснее. В swf'ке, cкомпиленной восьмеркой, и запущенной в независимом плеере и в браузере утечка наблюдается. А в скомпиленной из девятки под AS2, в ТОМ ЖЕ САМОМ плеере (9.0.45.0) никаких утечек. Ни в браузере, ни в независимом. Делаем вывод - баг восьмерки. Граблю запомнить и не наступать.
__________________
...Тебе страшно? Мне - нет. |
|
|||||
Et cetera
Регистрация: Sep 2002
Сообщений: 30,784
|
А я бы не наступил никогда
Ибо у меня битмапы по нормальным, не локальным ссылкам и убиваются, когда нужно Судя по всему проблема именно с локальными ссылками. |
|
|||||
Регистрация: Jan 2004
Адрес: На чердаке.
Сообщений: 1,112
|
iNils, сэнкс. Грабля редко бывает девственной - получив ручкой по башке проверь на наличие вмятин))
__etc, обычно так и делаю, поэтому столкнулся случайно. Правильно ли я понял, что метка, которую флэш ставит на переменную внутри функции, для того, чтобы коллектор смог удалить объект из памяти, является одновременно "якорем", не позволяющим удалить объект сразу после выхода из функции? Змея, кусающая себя за хвост?
__________________
...Тебе страшно? Мне - нет. |
|
|||||
Регистрация: Jan 2004
Адрес: На чердаке.
Сообщений: 1,112
|
И вдогонку, чтоб не создавать новой темы.
Существуют ли какие-то утилиты, позволяющие мониторить процессы внутри флэшплеера, с отображением, сколько памяти жрет тот или иной процесс или объект?
__________________
...Тебе страшно? Мне - нет. |
Часовой пояс GMT +4, время: 08:43. |
|
« Предыдущая тема | Следующая тема » |
|
|