![]() |
BitmapData & memory leaks
Случайно натолкнулся на такую вещь.
Код:
import flash.display.BitmapData;Код:
import flash.display.BitmapData; |
Немного перефразирую вопрос. В первом случае как раз все понятно: в момент присваивания переменной bm нового объекта срабатывает механизм garbage collector'a очистки по ссылкам.
Но вот что происходит во втором случае, заставило меня ломать голову... Где, и каким макаром, остаются ссылки на созданные объекты, раз их приходится удалять по меткам??? |
Во втором случае ссылок не остается, но битмапа где-то крепко сидит, если ее надо не delete а dispose..
|
В первом случае ты замещаешь старый битмап, а во втором постоянно создаешь новый битмап. Флеш плеер ставит некую отметку необходимого количества и переодически очищает память при превышении данной отметки (если, конечно, есть, что удалять).
|
Цитата:
delete удаляет ссылку на экземпляр. Если существуют другие ссылки - объект не удаляется. Собственно это мы и видим во втором примере. Если написать Код:
var bm:BitmapData = new BitmapData(1000, 1000, false, 0xFF000000);Цитата:
И вопрос второй: если при замещении срабатывает механизм очистки по ссылкам, то почему он не срабатывает при выходе из функции createBitmap()? |
А дальше, как говорила одна маленькая девочка из Зазеркалья - "Становится все страньше и страньше...."
Подобная хрень (назвать иначе язык не поворачивается) наблюдается в среде Flash8, но отсутствует во Flash9 (в том числе в альфе). Там никаких утечек. Далее еще интереснее. В swf'ке, cкомпиленной восьмеркой, и запущенной в независимом плеере и в браузере утечка наблюдается. А в скомпиленной из девятки под AS2, в ТОМ ЖЕ САМОМ плеере (9.0.45.0) никаких утечек. Ни в браузере, ни в независимом. Делаем вывод - баг восьмерки. Граблю запомнить и не наступать. |
А я бы не наступил никогда :D
Ибо у меня битмапы по нормальным, не локальным ссылкам и убиваются, когда нужно :) Судя по всему проблема именно с локальными ссылками. |
|
iNils, сэнкс. Грабля редко бывает девственной - получив ручкой по башке проверь на наличие вмятин))
__etc, обычно так и делаю, поэтому столкнулся случайно. Правильно ли я понял, что метка, которую флэш ставит на переменную внутри функции, для того, чтобы коллектор смог удалить объект из памяти, является одновременно "якорем", не позволяющим удалить объект сразу после выхода из функции? Змея, кусающая себя за хвост? |
И вдогонку, чтоб не создавать новой темы.
Существуют ли какие-то утилиты, позволяющие мониторить процессы внутри флэшплеера, с отображением, сколько памяти жрет тот или иной процесс или объект? |
| Часовой пояс GMT +4, время: 18:37. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.