В моей маленькой флекс-фреймворке, построенном с нуля, я определил класс ThreeDPoint, который содержит координаты x, y и z для отслеживания моих внутриигровых объектов, называемых актерами. Я также использую класс для создания векторов движения, которые складываются и складываются вместе в каждом кадре, чтобы создать кумулятивный вектор движения для каждого актера.
Я сделал класс ThreeDPoint неизменным, чтобы поддержать идею о том, что данная позиция не может быть изменена, вы можете только дать Актеру новую позицию, а также отговорить потенциальных клиентских программистов (меня!) От изменения векторов движения в стек, а не выделение нового вектора движения для создания того типа движения, который вам нужен.
К сожалению, производительность в этой системе падает очень быстро. Используя профилировщик Flex Builder, я отмечаю, что у меня есть утечка некоторых объектов ThreeDPoint (у меня есть 26 действующих лиц, у меня, вероятно, должно быть около 30, но всего за 60 секунд времени выполнения у меня получается более 1000 таких объектов), но поскольку настолько легки, фактический объем памяти довольно постоянен.
С другой стороны, профилировщик показывает более 250 000 объектов ThreeDPoint, созданных кумулятивно после 60 секунд времени выполнения. Теперь, будучи тем, как я намеренно создаю и выбрасываю эти объекты, мне это не кажется странным. Но единственное, что приходит на ум при просмотре такого профиля, это то, что огромное количество вызовов new () и GC (нет, я не вызываю GC явно) убивает производительность, особенно с учетом того факта, что когда я начал, и ThreeDPoint был изменчив, все было хорошо. Это кажется разумным?
package net.emptykingdom.utils
{
public class ThreeDPoint
{
public function ThreeDPoint(x:Number = 0, y:Number = 0, z:Number = 0)
{
this._x = x;
this._y = y;
this._z = z;
}
public function get X():Number { return _x; }
public function get Y():Number { return _y; }
public function get Z():Number { return _z; }
private var _x:Number = 0;
private var _y:Number = 0;
private var _z:Number = 0;
}
}
РЕДАКТИРОВАТЬ: Я обнаружил и удалил утечку памяти. Это привело к небольшому, но заметному усилению перфекта, хотя и не так велико, чтобы можно было создавать значительно большее число актеров. Согласно профилировщику, в моем коде по-прежнему преобладают вызовы конструктора ThreeDPoint. Возвращение к изменчивому ThreeDPoint вернуло мне немного производительности, которой я когда-то наслаждался. Поэтому я предполагаю, что создание экземпляров объектов Flex обходится дороже, чем в других средах, в которых я играл. Слишком плохо.