Форум 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 - массивы не настоящие массивы. Нужно тестировать, дает ли это выигрыш в производительности или надоборот ;).


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

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