Развитие игровой вспышки
Текущее время: Пн ноя 20, 2017 5:35 pm

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: Утечки памяти. Как их детектят?
СообщениеДобавлено: Ср окт 19, 2016 10:02 pm 
Не в сети

Зарегистрирован: Сб июн 11, 2011 8:12 pm
Сообщений: 302
1. Вопрос в заголовке.
2.

Рисую картинки много-много-много раз так:

Код:
BitmapData.copyPixels(Image, Image.rect, new Point(X, Y));


Постоянно создаётся Point, происходят ли в этом месте утечки? Засор GC?


Вернуться наверх
 Профиль Отправить e-mail  
 
 Заголовок сообщения: Re: Утечки памяти. Как их детектят?
СообщениеДобавлено: Ср окт 19, 2016 10:05 pm 
Не в сети
Аватар пользователя

Зарегистрирован: Вс ноя 03, 2013 2:30 pm
Сообщений: 329
Adobe Scout CC


Вернуться наверх
 Профиль Отправить e-mail  
 
 Заголовок сообщения: Re: Утечки памяти. Как их детектят?
СообщениеДобавлено: Ср окт 19, 2016 10:51 pm 
Не в сети
Аватар пользователя

Зарегистрирован: Вс дек 19, 2010 5:31 pm
Сообщений: 4844
Откуда: Пока не знаю
Сайт: http://gamespoweredby.com/blog/
Будет выделять память и потом будет ее GC уничтожать. Но не сразу, а как посчитает нужным. С каждым созданием нового объекта будет запущен GC. Сначала GC узнает сколько займет новый объект, хватит ли ему памяти. И потом начнет чистить, если памяти не хватит.

Получается так, что при написании new Point(X,Y) ты заставишь сработать GC (анализатор, а не фактичский сбор мусора, который лагает весь плеер). Но если все же надо будет ему собрать мусор - убивать он будет точно не последний new Point(), а что-то другое, что ты давно создал и на что уже никто не ссылается.

Чтоб избежать утечек памяти - всем объектам не забывай делать null, который больше никогда уже не будут использоваться. Я не о простых типах (строки, числа).

Если у тебя где-то в другом месте жопа - передавай не новую точку, а старую. Просто меняй в x, y. Так ты не будешь каждый фрейм заставлять GC проверять память и т.д.


Вернуться наверх
 Профиль Отправить e-mail  
 
 Заголовок сообщения: Re: Утечки памяти. Как их детектят?
СообщениеДобавлено: Чт окт 20, 2016 12:40 pm 
Не в сети
Аватар пользователя

Зарегистрирован: Ср сен 29, 2010 11:52 pm
Сообщений: 2662
Откуда: Одесса
eXAAAXe писал(а):
Рисую картинки много-много-много раз так:
Код:
BitmapData.copyPixels(Image, Image.rect, new Point(X, Y));

Постоянно создаётся Point, происходят ли в этом месте утечки? Засор GC?

Мало того, что засор, так еще и время на создание нового Point. Здесь это, конечно, не критично, но при высокой частоте, да на мобилах — заявит о себе.
Поэтому посоветую сразу привыкать к правилу: где можно не создавать новое — использовать старое.
Сделай себе private var _newPoint:Point = new Point();
И делай так везде и со всеми объектами, где наблюдается высокая частота.

Есть еще одно хорошее правило. Если метод возвращает какой-то объект, а не примитивный тип (int, Number, Boolean), то среди прочих аргументов метода передавай ему еще и этот самый объект, чтобы можно было не создавать новый, а просто записать в указанный результат работы метода.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Утечки памяти. Как их детектят?
СообщениеДобавлено: Чт окт 20, 2016 1:44 pm 
Не в сети

Зарегистрирован: Вт авг 03, 2010 8:08 pm
Сообщений: 610
Сайт: http://rainbow-games.com/
Zebestov писал(а):
Есть еще одно хорошее правило. Если метод возвращает какой-то объект, а не примитивный тип (int, Number, Boolean), то среди прочих аргументов метода передавай ему еще и этот самый объект, чтобы можно было не создавать новый, а просто записать в указанный результат работы метода.


Просто хочу уточнить.. Ты советуешь вместо -

Код:
function SomeFunc():SomeClass
{
    var returnElement:SomeClass = new SomeClass();
    return returnElement;
}
.....


использование -
Код:
var element:SomeClass = SomeFunc();


Делать так -
Код:
function SomeFunc( returnElement:SomeClass ):void
{
    returnElement.x = 10;  // заполняем поля....
}
.....


использование -
Код:
var element:SomeClass = new SomeClass();
SomeFunc( element );


Делать так? Но ведь никакого профита нет - объект все-равно надо создавать. Какая разница где - в функции или перед ее вызовом? Подозреваю, что имелось ввиду и элемент, который надо передавать в функцию сделать членом класса и создать в конструкторе.

Я все правильно понял?


Вернуться наверх
 Профиль Отправить e-mail  
 
 Заголовок сообщения: Re: Утечки памяти. Как их детектят?
СообщениеДобавлено: Чт окт 20, 2016 5:26 pm 
Не в сети
Аватар пользователя

Зарегистрирован: Вс дек 19, 2010 5:31 pm
Сообщений: 4844
Откуда: Пока не знаю
Сайт: http://gamespoweredby.com/blog/
Посмотри на encode у BitmapData. Ты туда передаешь ссылку на результирующий массив байт. Если не укажешь его - получишь новый объект.

public function encode(rect:Rectangle, compressor:Object, byteArray:ByteArray = null):ByteArray


Вернуться наверх
 Профиль Отправить e-mail  
 
 Заголовок сообщения: Re: Утечки памяти. Как их детектят?
СообщениеДобавлено: Пт окт 21, 2016 1:04 pm 
Не в сети
Аватар пользователя

Зарегистрирован: Ср сен 29, 2010 11:52 pm
Сообщений: 2662
Откуда: Одесса
TheRabbit правильно пояснил.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Утечки памяти. Как их детектят?
СообщениеДобавлено: Пт окт 21, 2016 5:27 pm 
Не в сети
Аватар пользователя

Зарегистрирован: Вс дек 19, 2010 5:31 pm
Сообщений: 4844
Откуда: Пока не знаю
Сайт: http://gamespoweredby.com/blog/
Из доков:

Помните, что при присвоении объекту значения null он необязательно будет удален из памяти. Иногда функция сборки мусора не выполняется, если доступный объем памяти не считается достаточно низким. Поведение функции сборки мусора не является предсказуемым. Сборщик мусора вызывается в результате выделения памяти, а не при удалении объекта. В процессе выполнения сборщик мусора находит структуры
объектов, которые еще не были собраны. Он обнаруживает неактивные объекты в структурах путем нахождения ссылающихся друг на друга объектов, которые больше не используются приложением. Обнаруженные таким образом неактивные объекты удаляются.

В больших приложениях этот процесс может интенсивно использовать ресурсы центрального процессора, снижать производительность и заметно замедлять работу приложения. Попробуйте ограничить число проходов по сборке мусора за счет максимально возможного повторного использования объектов. Кроме того, по возможности присваивайте ссылкам значение null, чтобы нахождение объектов при сборке мусора выполнялось быстрее. Сборку мусора следует рассматривать в качестве страховки. По возможности всегда явно управляйте сроком службы объектов.


Вернуться наверх
 Профиль Отправить e-mail  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5


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

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB