Flash ActionScript 3 — есть ли утечка памяти в этой функции?

#flash #actionscript-3 #memory-management

#вспышка #actionscript-3 #управление памятью

Вопрос:

Я начинаю разбираться с распределением памяти (и ActionScript 3 в целом), и я наткнулся на подобную функцию в учебном пособии:

 addEventListener(Event.ENTER_FRAME, enterFrame);

function enterFrame(e:Event):void
{

if(redClipBmpData.hitTest(new Point(redClip.x, redClip.y),255,blueClipBmpData,new Point(blueClip.x, blueClip.y),255))

trace("hit");

}
 

Часть, о которой я беспокоюсь, — это бит «новая точка …» в функции hitTest. Таким образом, каждый раз, когда вызывается функция, выделяется новая память для хранения точечного объекта.

Поскольку нет ссылок на точку (например, var a: Point = new Point(…)), означает ли это, что сборщик мусора освободит память для «новой точки» после вызова функции?

Было бы лучше написать это что-то вроде:

 var a:Point = new Point(); 
 

вне функции enterFrame, затем внутри функции enterFrame напишите:

 a.x = redClip.x

a.y = redClip.y
 

Так что вы повторно используете память, на которую ссылается переменная?

Пожалуйста, поправьте меня, если мое предварительное понимание памяти неверно.

Ответ №1:

GC не будет немедленно освобождать память после выполнения функции, но точечные объекты будут иметь право на сборку мусора всякий раз, когда происходит очистка. Flash GC освобождает память, когда это необходимо.

Вы могли бы объявить точечный объект вне функции, чтобы когда-либо создавался только один, но тогда вам нужно не забыть уничтожить любую ссылку на него, когда вы закончите с ним. Я думаю, что любой прирост эффективности был бы незначительным.

Комментарии:

1. Я бы все равно остановился на последнем пункте ради чистоты. Мне кажется небрежным создавать новый объект в каждом кадре.

2. @MartyWallace, просто чтобы поспорить за другую сторону. Создание внешнего многоразового Point использования создает проблему обслуживания; а также возможность ошибок, когда все усложняется. Мы получаем больше гибкости, когда минимизируем общее состояние; это просто еще одна вещь, о которой нужно беспокоиться при рефакторинге кода — и с какой целью, незначительный или несуществующий прирост производительности? Но я не говорю, что для этого нет времени и места! 😉

3. Это не так много для увеличения производительности.. Концепция создания нового объекта снова и снова кажется мне очень запутанной. Кроме того, не так сложно создать deconstruct функцию или что-то в конце вашего класса и скрыть все эти вещи.

4. Спасибо за ваши разъяснения, shanethehat. Приятно знать, что эти точки будут очищены. Просто из любопытства, кто-нибудь знает, примерно большой ли точечный объект (у него есть 3 числа и пара функций в его классе) и с какой скоростью (в секунду?) появляется сборщик мусора?