从视图和内存池中删除Flex DisplayObject

时间:2011-02-15 02:17:36

标签: flex

我有一个Flex应用程序的问题,我没有构建,所以我可以提供我的所有发现,但对于任何不清晰感到抱歉。

有一个包含7个主视图的Flex应用程序。在视图之间导航时存在内存问题。

所有这些视图都在ViewStack中,但由于某些涉及3D对象,我认为在显示列表中显示它太多了。我现在正在清理堆栈中的所有子项,并在需要时添加/删除它们。这使得性能略有提高,但仍然无法使用。奇怪的是,有了这个和原始方法,CPU随着使用而攀升,但最终在某个地方升级。现在我在导航到每个屏幕并将前一个变量设置为null时创建每个屏幕的新实例。现在看起来CPU在创建视图时会出现尖峰,但是会升级到远低于它的程度。这感觉就像进步一样,但是现在可用的记忆力不断攀升到以前的地方......

我的理解是调用remove child或者删除所有孩子会在垃圾收集器下次运行时将对象标记为删除。我看不到对该实例的任何其他引用。我的代码是

this.parentApplication.viewstack.removeAllChildren();
this.parentApplication.viewstack.addChild(new HomeScreen);

我为每个按钮都有一个函数来添加一个像上面这样的新实例。

我唯一可以看到和感觉愚蠢但需要确认的东西,每个视图都扩展了一个名为“Screen”的类,这个类包含对一些核心组件的单例引用

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

这会让垃圾收集器认为它仍然需要吗? 从内存池清除对象的一般建议真棒!我从来不需要如此深入地分析Flash Player。

解决:我认为这是一个错误的声音驱动程序,删除所有的声音和她像小猫一样咕噜咕噜。使用Windows XP可以在我的机器上正常工作,但触摸板上没有应用程序崩溃的Windows 7(不确定驱动程序现在正在调查它们)。

更新:现在我认为它不是驱动程序,尝试了3个不同的版本,都没有任何改进。我确实发现声音在TweenLite lib中逐渐消失。看起来TweenLite中没有任何内存泄漏,因为它在其他机器上运行正常。只是使用volumeEasingFunction似乎消耗了越来越多的CPU,直到它吓坏了。它是运行Windows 7的糟糕硬件,但没有用。

1 个答案:

答案 0 :(得分:2)

首先想到的是你应该在事件监听器中将use weak参数设置为true。这是第五个参数,所以在你的例子中:

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

Grant Skinner在AS3 Resource Management上有一个很棒的3部分系列,可能会帮助你更好地了解要寻找的内容。您可以在part 3或在发布第3部分之前编写的standalone article中找到有关弱引用侦听器的详细信息。