|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Dec 2012
Сообщений: 61
|
Вопрос по использованию BitmapData.dispose() для повторно используемых объектов
Добрый вечер!
В моей игре есть ряд объектов-врагов, которые при выполнении определенных действий удаляются со сцены спрайта. каждый враг - это спрайт, в котором находится битмап. для очистки памяти я делаю BitmapData.dispose() для удаленных со сцены врагов. начал оптимизировать игру и понял что это отдельная наука... и работы будет еще много похоже. Столкнулся с интересной штукой - когда я этих врагов хочу использовать заново, соответственно, задаю им значение BitmapData - вижу несколько результатов: 1) картинка появляется, но через пару секунд исчезает - при этом метод который у меня это делает не вызывается; 2) картинка не появляется вообще; 3) иногда картинка нормально аттачится к контейнеру и ведет себя как положено - что случается крайне редко. код которым удаляю битмапдату - да какой это код - одна строчка из документации: SourceMBP - "лицо" врага код, который заново подгружает ее source - это объект который расширяет bitmap и хранит в себе все состояния врагов - картинок 12. SourceBMP = new Bitmap; SourceBMP.x = -95; SourceBMP.y = -55; SourceBMP.scaleX = 1; SourceBMP.scaleY = 1; SourceBMP.bitmapData = source.bitmapData; Может быть, это GC заработал и "почистил" память от ненужных как ему кажется объектов? Заранее спасибо, если вопрос идиотский, направьте пожалуйста по ссылке с нужными доками, обязательно почитаю и переформулирую вопрос =) С уважением, Павел. |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
BitmapData передается по ссылке, а не по значению.
уничтожает source.bitmapData
__________________
Reality.getBounds(this); |
|
|||||
[+1 22.04.13]
[+1 06.03.13] Регистрация: Apr 2012
Сообщений: 239
|
хранить одну и ту же картинку в каждом экземпляре класса тоже не камильфо, лучше уже тогда из памяти не диспосить
|
|
|||||
Регистрация: Dec 2012
Сообщений: 61
|
спасибо! привык к ссылкам в 1С, не думал что тут тоже есть такое)
я понял, что удалялся исходный объект, это многое объясняет. Но также я понял, что создав когорту врагов штук 20 - 30 используя одну битмапу, мне и диспоз не обязательно применять - т.к. по факту один объект всего то - тот в который я подгрузил 12 картинок - source? а при отборе из массива врага я обновлю ему ссылку на новую битмапу. Оптимально так сделать? |
|
|||||
Цитата:
GC как раз и существует для того, чтобы выяснять, когда объект _никем_ не используется и только тогда удалять. а BitmapData.dispose() - это чисто чтобы помочь GC, если программист _знает_ сам _когда_ объект перестаёт использоваться всеми, кому он был нужен |
|
|||||
Регистрация: Dec 2012
Сообщений: 61
|
Цитата:
|
|
|||||
Что значит GC - ненадёжная штука? Вы хотите как в C++ вручную следить за объектами? Дык Вам и это позволят сделать только для BitmapData и Xml - а для остального просто нет инструментов. Я уж молчу о сложности.
GC - это неотъемлемая часть виртуальной машины flashplayer - без неё ничего работать не будет. А у Вас проблема в том, что вы удаляете bitmapData, которая используется другими объектами, или которую собираетесь использовать снова - где логика? Если Вы решили удалять bitmapData после удаления спрайта со сцены - надо запретить разным объектам пользоваться одной bitmapData. И каждый раз пересоздавать её при добавлении на сцену. Это _очень_ неефективно и по скорости и по памяти. Или: самому завести счётчик ссылок на bitmapData, менять его при добавлении/удалении и удалять, когда он уйдет в 0. А GC это всё делает за Вас, причём в разы надёжнее. Единственная проблема - он срабатывает когда ему захочется, что _иногда_ создаёт трудности. А так - если не можете определить время ненужности объекта - нечего трогать метод dispose - всё просто! Цитата:
|
|
|||||
Регистрация: Dec 2012
Сообщений: 61
|
У меня не было намерения удалять объект, который используется другими - просто не знал что так происходит. теперь знаю, за что спасибо всем ответившим в ветке.
насчет не трогать диспоз - согласен - в моем случае это явно лишнее. |
Часовой пояс GMT +4, время: 17:40. |
|
« Предыдущая тема | Следующая тема » |
|
|