Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   memory leaks - как ловить и бороться? (http://www.flasher.ru/forum/showthread.php?t=130165)

progman 19.09.2009 11:29

memory leaks - как ловить и бороться?
 
у меня в игре происходит очень интенсивная работа с памятью.
создаются сотни объектов - юнитов, выделяется в них память под массивы, объекты удаляются, списки очищаются. Требуется контроллировать утечки памяти. В С++ движке у меня свой манагер памяти который следит за выделением памяти и сигнализирует если вдруг чего не освободил.

какие механизмы в АС3 гарантируют освобождение выделенной памяти?
как проконтролировать что память освободилась?
имеется ли возможность заметить "родной" менеджер памяти на свой?

ибо чую что грустно все может получиться если не контроллировать память.

etc 19.09.2009 11:52

Механизмов по управлению памятью в AS3 нет. Есть GC, он работает автоматически. Но для того, чтобы он сработал, необходимо соблюдать правил «намусорил — убери».

progman 19.09.2009 12:05

Цитата:

Сообщение от etc (Сообщение 852010)
Но для того, чтобы он сработал, необходимо соблюдать правил «намусорил — убери».

хм...
ок. есть объект:
Код AS3:

unit = new Unit();// - создал
m_unitlist.push( unit ); //- добавил в массив

удалаю:
Код AS3:

var m_unit: Unit = m_unitlist[i];
m_unitlist[i] = m_unitlist[ m_unitlist.length - 1 ];
m_unitlist.pop();// - удалил из массива iй элемент
 
m_unit.destroy(); //вызываю деструктор
delete( m_unit );
m_unit = null;

при такой схеме удалится ли в реальности объект unit ?
удалится ли сама вся память под объекты в Unit выделенная через new или для каждого объекта вызвать delete надо?

ну и как нибудь можно подсмотреть у GC что в памяти осталось и что не убрано?

etc 19.09.2009 12:07

Удалится (только я не понял шаманства с индексами в массиве, m_unitlist.splice(i, 1) достаточно). delete — только для динамических свойств.

И да, в Flex Builder есть профайлер.

progman 19.09.2009 12:22

Цитата:

Сообщение от etc (Сообщение 852012)
Удалится (только я не понял шаманства с индексами в массиве, m_unitlist.splice(i, 1) достаточно). delete — только для динамических свойств.

шаманства нет - старый прием еще по работе с std::vector - нужный к удалению элемент замещается на последний из хвоста массива и последний удаляется pop или erase
с точки зрения расположения массива в памяти быстрее и дешевле стереть последний элемент нежели из середины ибо удаление элемента из середины приводит к большой memcpy что не есть гуд.

Цитата:

Сообщение от etc (Сообщение 852012)
И да, в Flex Builder есть профайлер.

можешь ссылку кинуть чтобы поподробнее с сабжем познакомиться?

etc 19.09.2009 12:28

С кем, с Flex Builder? http://adobe.com/products/flex/

Psycho Tiger 19.09.2009 12:37

Код AS3:

m_unitlist[i] = m_unitlist[ m_unitlist.length - 1 ];

Эээ?

etc 19.09.2009 12:39

Цитата:

Сообщение от Psycho Tiger (Сообщение 852025)
Код AS3:

m_unitlist[i] = m_unitlist[ m_unitlist.length - 1 ];

Эээ?

Что смущает?

Psycho Tiger 19.09.2009 12:50

а, всё, туплю, понял. Все нормально.

Smrad 19.09.2009 13:03

Код AS3:

m_unitlist[i] = m_unitlist[ m_unitlist.length - 1 ];

В AS3 - массивы не настоящие массивы. Нужно тестировать, дает ли это выигрыш в производительности или надоборот ;).

veisss 19.09.2009 13:28

progman ети Unit-ы только в масиве или ето DisplayObject-ы и ты их потом кудато addChild-ишь если ето так то я думаю флешь удаляет только линк который достаешь из масива, попробуй трейсить numChildren-ы у контейнеров

progman 19.09.2009 13:30

Цитата:

Сообщение от Smrad (Сообщение 852031)
Код AS3:

m_unitlist[i] = m_unitlist[ m_unitlist.length - 1 ];

В AS3 - массивы не настоящие массивы. Нужно тестировать, дает ли это выигрыш в производительности или надоборот ;).

ну полюбому в интерпритаторе это есть список объектов std::list или std::map в недрах реализации.

Добавлено через 1 минуту
Цитата:

Сообщение от veisss (Сообщение 852035)
progman ети Unit-ы только в масиве или ето DisplayObject-ы и ты их потом кудато addChild-ишь если ето так то я думаю флешь удаляет только линк который достаешь из масива, попробуй трейсить numChildren-ы у контейнеров

Unit это мой класс и он только в массиве.
более того у меня вообще от флеша нет ничего. только один мувиклип 640х480 который я юзаю как поверхность для отрисовки моего контента. и все объекты внутри игровые либо статикой либо в массивах.

Smrad 19.09.2009 13:59

Цитата:

Сообщение от progman (Сообщение 852036)
ну полюбому в интерпритаторе это есть список объектов std::list или std::map в недрах реализации.

Конечно нет. У Array сложность обращения к элементам константная, у листа линейная, а у мапа логарифмическая. Скорее всего "в недрах" своя структура данных. Я про то, что перед оптимизацией неплохо было бы проверять ее надобность.

progman 19.09.2009 14:08

Цитата:

Сообщение от Smrad (Сообщение 852041)
Конечно нет. У Array сложность обращения к элементам константная, у листа линейная, а у мапа логарифмическая. Скорее всего "в недрах" своя структура данных. Я про то, что перед оптимизацией неплохо было бы проверять ее надобность.

хм... тогда да. согласен.


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

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