Удаление Flex DisplayObjects из представления И пула памяти - PullRequest
2 голосов
/ 15 февраля 2011

У меня проблема с приложением Flex, которое я не создавал, поэтому я могу предоставить все свои выводы, но извините за отсутствие ясности.

Существует приложение Flex с 7 основными видами. При перемещении между представлениями возникает проблема с памятью.

Все эти виды были в ViewStack, но из-за некоторых задействованных трехмерных объектов я предположил, что было слишком много, чтобы все это было в списке отображения. Теперь я очищаю все дочерние элементы из стека и добавляю / удаляю их при необходимости. Это дало небольшое увеличение производительности, но все равно перестало отвечать на запросы при использовании. Странная вещь, с этим и оригинальным методом, процессор поднимается с использованием, но в конечном итоге выравнивается где-то. Теперь я создаю новые экземпляры каждого экрана при переходе к ним и устанавливаю предыдущую переменную равной нулю. Теперь это выглядит так, как будто процессор создает пики при создании представления, но выравнивается до чего-то намного более низкого, чем было. Это было похоже на прогресс, но теперь доступная память продолжает расти там, где раньше не было ...

Насколько я понимаю, вызов удаления дочерних элементов или удаления всех дочерних элементов пометит объект для удаления при следующем запуске сборщика мусора. Я не вижу никаких других ссылок на экземпляр. Мой код соответствует строчке

this.parentApplication.viewstack.removeAllChildren ();
this.parentApplication.viewstack.addChild (новый HomeScreen);

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

Единственное, что я вижу и чувствую глупым вопросом, но нуждаюсь в подтверждении, это то, что каждое представление расширяет класс с именем "Screen", этот класс содержит одноэлементную ссылку на некоторые основные компоненты

this.model = PancakeApplication.instance.model; this.meaModel = MeaApplication.instance.meaModel; this.meaModel.addEventListener (ScreenChangeEvent.SCREEN_CHANGE, selectedScreenChangeHandler);

Может ли это заставить сборщика мусора думать, что он все еще нужен? Общий совет по очистке объектов из пула памяти был бы потрясающим !!! Мне никогда не приходилось анализировать Flash Player с такой глубиной.

решено: Я думаю, что это ошибка с драйверами звука, удаляющими весь звук и мурлыкающими, как котенок. Работает на моей машине с Windows XP, но не с сенсорной панелью, на которой происходит сбой приложения с Windows 7 (неуверенный в драйверах, которые сейчас их изучают).

ОБНОВЛЕНИЕ: Теперь я думаю, что это не драйверы, пробовал 3 разных версии, все без улучшения. Я обнаружил, что звук постепенно исчезает с помощью библиотеки TweenLite. Не похоже, что в TweenLite есть утечки памяти, так как он отлично работает на других машинах. Кажется, что только использование volumeEasingFunction потребляет все больше ресурсов ЦП, пока оно не сойдет с ума. Это дрянное оборудование под управлением Windows 7, которое не помогает.

1 Ответ

2 голосов
/ 15 февраля 2011

Первое, что приходит на ум, это то, что вы должны установить для параметра слабых ссылок значение true в своем прослушивателе событий. Это пятый параметр, поэтому в вашем примере:

this.meaModel.addEventListener(ScreenChangeEvent.SCREEN_CHANGE, electedScreenChangeHandler, false, 0, true);

У Гранта Скиннера есть отличная серия из 3 частей по AS3 Resource Management , которая, вероятно, поможет вам лучше понять, что искать. Подробную информацию о слушателях со слабыми ссылками можно найти в part 3 или в отдельной статье , написанной до публикации части 3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...