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

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

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

Регистрация: Dec 2012
Сообщений: 61
По умолчанию Вопрос по использованию BitmapData.dispose() для повторно используемых объектов

Добрый вечер!

В моей игре есть ряд объектов-врагов, которые при выполнении определенных действий удаляются со сцены спрайта. каждый враг - это спрайт, в котором находится битмап. для очистки памяти я делаю BitmapData.dispose() для удаленных со сцены врагов.

начал оптимизировать игру и понял что это отдельная наука... и работы будет еще много похоже.

Столкнулся с интересной штукой - когда я этих врагов хочу использовать заново, соответственно, задаю им значение BitmapData - вижу несколько результатов:
1) картинка появляется, но через пару секунд исчезает - при этом метод который у меня это делает не вызывается;
2) картинка не появляется вообще;
3) иногда картинка нормально аттачится к контейнеру и ведет себя как положено - что случается крайне редко.

код которым удаляю битмапдату - да какой это код - одна строчка из документации:
SourceMBP - "лицо" врага
Код AS3:
SourceBMP.bitmapData.dispose();
код, который заново подгружает ее
source - это объект который расширяет bitmap и хранит в себе все состояния врагов - картинок 12.

Код AS3:
SourceBMP = new Bitmap;
SourceBMP.x = -95;
SourceBMP.y = -55;
SourceBMP.scaleX = 1;
SourceBMP.scaleY = 1;
SourceBMP.bitmapData = source.bitmapData;
думал проблема в моем классе, но без Dispose все работает и новые картинки аттачатся в спрайт врага.

Может быть, это GC заработал и "почистил" память от ненужных как ему кажется объектов?

Заранее спасибо, если вопрос идиотский, направьте пожалуйста по ссылке с нужными доками, обязательно почитаю и переформулирую вопрос =)

С уважением,

Павел.

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
BitmapData передается по ссылке, а не по значению.
Код AS3:
SourceBMP.bitmapData.dispose();
уничтожает source.bitmapData
__________________
Reality.getBounds(this);

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
можно заменить
Код AS3:
SourceBMP.bitmapData = source.bitmapData;
на
Код AS3:
SourceBMP.bitmapData = source.bitmapData.clone();
тогда будет работать

Старый 02.02.2013, 11:39
gagaga вне форума Посмотреть профиль Отправить личное сообщение для gagaga Найти все сообщения от gagaga
  № 4  
Ответить с цитированием
gagaga
[+1 22.04.13]
[+1 06.03.13]

Регистрация: Apr 2012
Сообщений: 239
хранить одну и ту же картинку в каждом экземпляре класса тоже не камильфо, лучше уже тогда из памяти не диспосить

Старый 02.02.2013, 12:31
PaladinNew вне форума Посмотреть профиль Отправить личное сообщение для PaladinNew Найти все сообщения от PaladinNew
  № 5  
Ответить с цитированием
PaladinNew

Регистрация: Dec 2012
Сообщений: 61
спасибо! привык к ссылкам в 1С, не думал что тут тоже есть такое)

я понял, что удалялся исходный объект, это многое объясняет. Но также я понял, что создав когорту врагов штук 20 - 30 используя одну битмапу, мне и диспоз не обязательно применять - т.к. по факту один объект всего то - тот в который я подгрузил 12 картинок - source? а при отборе из массива врага я обновлю ему ссылку на новую битмапу. Оптимально так сделать?

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

Регистрация: Jan 2009
Сообщений: 3,067
Записей в блоге: 3
Отправить сообщение для GBee с помощью Skype™
Цитата:
привык к ссылкам в 1С, не думал что тут тоже есть такое)
Это вы красиво опустили.
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку.

Старый 02.02.2013, 15:24
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 7  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
В моей игре есть ряд объектов-врагов, которые при выполнении определенных действий удаляются со сцены спрайта. каждый враг - это спрайт, в котором находится битмап. для очистки памяти я делаю BitmapData.dispose() для удаленных со сцены врагов.
Ну так здрасте - GC не для красоты придумали. А то можно было бы dispose вызывать и в ус не дуть.
GC как раз и существует для того, чтобы выяснять, когда объект _никем_ не используется и только тогда удалять.
а BitmapData.dispose() - это чисто чтобы помочь GC, если программист _знает_ сам _когда_ объект перестаёт использоваться всеми, кому он был нужен

Старый 02.02.2013, 16:56
PaladinNew вне форума Посмотреть профиль Отправить личное сообщение для PaladinNew Найти все сообщения от PaladinNew
  № 8  
Ответить с цитированием
PaladinNew

Регистрация: Dec 2012
Сообщений: 61
Цитата:
Сообщение от expl Посмотреть сообщение
Ну так здрасте - GC не для красоты придумали. А то можно было бы dispose вызывать и в ус не дуть.
GC как раз и существует для того, чтобы выяснять, когда объект _никем_ не используется и только тогда удалять.
а BitmapData.dispose() - это чисто чтобы помочь GC, если программист _знает_ сам _когда_ объект перестаёт использоваться всеми, кому он был нужен
Просто я прочитал многое о GC, сложилось впечатление что это не надежная штука, и по этому решил использовать существующие объекты, а не создавать из заново, надеясь что он удалит старые. плюс в этой ветке мне объяснили, что удаляется source.bitmapData - так вроде бы GC и не причем тогда. Поправьте меня если я не прав.

Старый 02.02.2013, 17:35
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 9  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Что значит GC - ненадёжная штука? Вы хотите как в C++ вручную следить за объектами? Дык Вам и это позволят сделать только для BitmapData и Xml - а для остального просто нет инструментов. Я уж молчу о сложности.
GC - это неотъемлемая часть виртуальной машины flashplayer - без неё ничего работать не будет.

А у Вас проблема в том, что вы удаляете bitmapData, которая используется другими объектами, или которую собираетесь использовать снова - где логика?

Если Вы решили удалять bitmapData после удаления спрайта со сцены - надо запретить разным объектам пользоваться одной bitmapData. И каждый раз пересоздавать её при добавлении на сцену.
Это _очень_ неефективно и по скорости и по памяти.

Или: самому завести счётчик ссылок на bitmapData, менять его при добавлении/удалении и удалять, когда он уйдет в 0.
А GC это всё делает за Вас, причём в разы надёжнее. Единственная проблема - он срабатывает когда ему захочется, что _иногда_ создаёт трудности.

А так - если не можете определить время ненужности объекта - нечего трогать метод dispose - всё просто!

Цитата:
плюс в этой ветке мне объяснили, что удаляется source.bitmapData - так вроде бы GC и не причем тогда
Если даже Вы не вызовете dispose у BitmapData - GC в своё время её всё равно снесёт, когда не останется на неё ссылок (dispose() - это если _знаете_ что bitmapData никем боле не используется и хотите очистить память прям щас)

Старый 02.02.2013, 18:11
PaladinNew вне форума Посмотреть профиль Отправить личное сообщение для PaladinNew Найти все сообщения от PaladinNew
  № 10  
Ответить с цитированием
PaladinNew

Регистрация: Dec 2012
Сообщений: 61
У меня не было намерения удалять объект, который используется другими - просто не знал что так происходит. теперь знаю, за что спасибо всем ответившим в ветке.

насчет не трогать диспоз - согласен - в моем случае это явно лишнее.

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

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

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


 


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


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