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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 19.07.2007, 19:54
Ромастый вне форума Посмотреть профиль Отправить личное сообщение для Ромастый Найти все сообщения от Ромастый
  № 1  
Ответить с цитированием
Ромастый
 
Аватар для Ромастый

Регистрация: 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;
Тут все ок.

Код:
import flash.display.BitmapData;
function createBitmap() {
	var bm:BitmapData = new BitmapData(1000, 1000, false, 0xFF000000);
}
onEnterFrame = createBitmap;
Во втором варианте наблюдаются некислая утечка памяти, которая периодически очищается коллектором. Фактически мы наблюдаем механизм очистки по меткам, но интересует другой вопрос - кто виноват и что делать, а точнее - если где-то создаются неявные или перекрестные ссылки на созданные экземпляры BitmapData, так что их приходится удалять по меткам, то почему этого не возникает в первом варианте?
__________________
...Тебе страшно? Мне - нет.

Старый 19.07.2007, 20:02
Ромастый вне форума Посмотреть профиль Отправить личное сообщение для Ромастый Найти все сообщения от Ромастый
  № 2  
Ответить с цитированием
Ромастый
 
Аватар для Ромастый

Регистрация: Jan 2004
Адрес: На чердаке.
Сообщений: 1,112
Немного перефразирую вопрос. В первом случае как раз все понятно: в момент присваивания переменной bm нового объекта срабатывает механизм garbage collector'a очистки по ссылкам.

Но вот что происходит во втором случае, заставило меня ломать голову... Где, и каким макаром, остаются ссылки на созданные объекты, раз их приходится удалять по меткам???
__________________
...Тебе страшно? Мне - нет.

Старый 19.07.2007, 20:48
Kikasso вне форума Посмотреть профиль Отправить личное сообщение для Kikasso Найти все сообщения от Kikasso
  № 3  
Ответить с цитированием
Kikasso
 
Аватар для Kikasso

Регистрация: Oct 2006
Адрес: spb.ru
Сообщений: 3,221
Во втором случае ссылок не остается, но битмапа где-то крепко сидит, если ее надо не delete а dispose..

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

Регистрация: Sep 2002
Сообщений: 30,784
В первом случае ты замещаешь старый битмап, а во втором постоянно создаешь новый битмап. Флеш плеер ставит некую отметку необходимого количества и переодически очищает память при превышении данной отметки (если, конечно, есть, что удалять).

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

Регистрация: Jan 2004
Адрес: На чердаке.
Сообщений: 1,112
Цитата:
Сообщение от Kikasso
Во втором случае ссылок не остается, но битмапа где-то крепко сидит, если ее надо не delete а dispose..
С dispose никаких вопросов, так как метод очищает память, занятую под объект битмапдаты, а именно удаляет массив пикселов и очищает каналы, но сам при этом экземпляр не удаляет.

delete удаляет ссылку на экземпляр. Если существуют другие ссылки - объект не удаляется. Собственно это мы и видим во втором примере. Если написать
Код:
var bm:BitmapData = new BitmapData(1000, 1000, false, 0xFF000000);
delete bm;
Утечка никуда не исчезает, и это значит, что действительно где-то есть еще ссылки. Вопрос - почему эти ссылки не возникают (или сразу удаляются) в варианте первом...

Цитата:
Сообщение от __etc
В первом случае ты замещаешь старый битмап, а во втором постоянно создаешь новый битмап. Флеш плеер ставит некую отметку необходимого количества и переодически очищает память при превышении данной отметки (если, конечно, есть, что удалять).
Собственно, это и так ясно из первого поста. Вопрос чуть выше...
И вопрос второй: если при замещении срабатывает механизм очистки по ссылкам, то почему он не срабатывает при выходе из функции createBitmap()?
__________________
...Тебе страшно? Мне - нет.

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

Регистрация: Jan 2004
Адрес: На чердаке.
Сообщений: 1,112
А дальше, как говорила одна маленькая девочка из Зазеркалья - "Становится все страньше и страньше...."

Подобная хрень (назвать иначе язык не поворачивается) наблюдается в среде Flash8, но отсутствует во Flash9 (в том числе в альфе). Там никаких утечек.
Далее еще интереснее. В swf'ке, cкомпиленной восьмеркой, и запущенной в независимом плеере и в браузере утечка наблюдается.
А в скомпиленной из девятки под AS2, в ТОМ ЖЕ САМОМ плеере (9.0.45.0) никаких утечек. Ни в браузере, ни в независимом.

Делаем вывод - баг восьмерки. Граблю запомнить и не наступать.
__________________
...Тебе страшно? Мне - нет.

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

Регистрация: Sep 2002
Сообщений: 30,784
А я бы не наступил никогда
Ибо у меня битмапы по нормальным, не локальным ссылкам и убиваются, когда нужно
Судя по всему проблема именно с локальными ссылками.

Старый 20.07.2007, 14:34
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 8  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,879
Записей в блоге: 7
http://www.gskinner.com/blog/archive...flash_pla.html
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 20.07.2007, 14:57
Ромастый вне форума Посмотреть профиль Отправить личное сообщение для Ромастый Найти все сообщения от Ромастый
  № 9  
Ответить с цитированием
Ромастый
 
Аватар для Ромастый

Регистрация: Jan 2004
Адрес: На чердаке.
Сообщений: 1,112
iNils, сэнкс. Грабля редко бывает девственной - получив ручкой по башке проверь на наличие вмятин))

__etc, обычно так и делаю, поэтому столкнулся случайно.
Правильно ли я понял, что метка, которую флэш ставит на переменную внутри функции, для того, чтобы коллектор смог удалить объект из памяти, является одновременно "якорем", не позволяющим удалить объект сразу после выхода из функции?
Змея, кусающая себя за хвост?
__________________
...Тебе страшно? Мне - нет.

Старый 20.07.2007, 15:00
Ромастый вне форума Посмотреть профиль Отправить личное сообщение для Ромастый Найти все сообщения от Ромастый
  № 10  
Ответить с цитированием
Ромастый
 
Аватар для Ромастый

Регистрация: Jan 2004
Адрес: На чердаке.
Сообщений: 1,112
И вдогонку, чтоб не создавать новой темы.
Существуют ли какие-то утилиты, позволяющие мониторить процессы внутри флэшплеера, с отображением, сколько памяти жрет тот или иной процесс или объект?
__________________
...Тебе страшно? Мне - нет.

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

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

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


 


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


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