Apache flex 从视图和内存池中删除Flex DisplayObjects

Apache flex 从视图和内存池中删除Flex DisplayObjects,apache-flex,Apache Flex,我对Flex应用程序有一个问题,一个我没有构建的应用程序,所以我可以提供我的所有发现,但很抱歉,它不够清晰 有一个包含7个主视图的Flex应用程序。在视图之间导航时存在内存问题 所有这些视图都在一个ViewStack中,但由于一些涉及3D对象,我认为将其全部包含在显示列表中太多了。我现在正在清除堆栈中的所有子项,并在需要时添加/删除它们。这使性能略有提高,但在使用过程中仍会变得迟钝。奇怪的是,使用这种方法和原来的方法,CPU的使用率会上升,但最终会在某个地方趋于平稳。现在,当导航到每个屏幕时,我

我对Flex应用程序有一个问题,一个我没有构建的应用程序,所以我可以提供我的所有发现,但很抱歉,它不够清晰

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

所有这些视图都在一个ViewStack中,但由于一些涉及3D对象,我认为将其全部包含在显示列表中太多了。我现在正在清除堆栈中的所有子项,并在需要时添加/删除它们。这使性能略有提高,但在使用过程中仍会变得迟钝。奇怪的是,使用这种方法和原来的方法,CPU的使用率会上升,但最终会在某个地方趋于平稳。现在,当导航到每个屏幕时,我正在创建它们的新实例,并将前一个变量设置为null。现在看起来,在创建视图时,CPU的速度正在加快,但速度比以前低了很多。这感觉像是进步,但现在可用的内存不断攀升,这是以前没有的

我的理解是,当垃圾收集器下次运行时,调用remove child或remove all children会将对象标记为删除。我看不到对该实例的任何其他引用。我的代码与

this.parentApplication.viewstack.removeAllChildren()
this.parentApplication.viewstack.addChild(新主屏幕)

我为每个按钮都提供了一个函数来添加一个新实例,如上面所述

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

this.model=panakeapplication.instance.model; this.meaModel=MeaApplication.instance.meaModel; this.meaModel.addEventListener(ScreenChangeEvent.SCREEN_CHANGE,SelectedScreenChangeHandler)

这会诱使垃圾收集器认为它仍然是需要的吗? 关于从内存池中清除对象的一般建议非常棒!!!我从来没有必要对Flash播放器进行如此深入的分析

解决方案:我认为这是声音驱动程序的错误,删除了所有声音,她像小猫一样发出呼噜声。使用windows XP在我的机器上可以正常工作,但在windows 7应用程序崩溃的触摸板上不能正常工作(不确定现在是否有驱动程序在查看它们)


更新:现在我认为这不是驱动程序,尝试了3个不同的版本,都没有改进。我确实发现声音随着TweenLite lib的音乐逐渐减弱。TweenLite看起来没有内存泄漏,因为它可以在其他机器上正常工作。仅仅使用volumeEasingFunction似乎会消耗越来越多的CPU,直到它崩溃。运行windows 7的是糟糕的硬件,没有任何帮助。

首先想到的是,您应该在事件侦听器中将use-weak-reference参数设置为true。它是第五个参数,因此在您的示例中:

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

格兰特·斯金纳(Grant Skinner)有一个很棒的三集系列,它可能会帮助你更好地了解要寻找什么。您可以在发布第3部分之前的书面文档中找到有关弱引用侦听器的详细信息。

+1获取弱引用注释。从现在起,我将在我的事件监听器中使用它。感谢回复jss,该链接非常有用。