2008-08-22 63 views
1

我的网站完全基于Flash,它围绕一个3D模型进行移动,该模型以我已转换为FLV文件的视频块的形式呈现给我。我正在使用FLVPlayback组件来控制我的程序中的视频。在使用System.totalMemory运行内存检查时,我注意到,每当加载视频时,它都会占用大量内存,即使我从中删除了所有事件侦听器(它们都是弱引用的),将组件从它的父节点,停止视频并将组件实例归零,它仍然不会返回该内存。FLVPlayback组件内存问题

自从我开始在这个项目上工作以来,这一直困扰着我,因为用户可能实例化和加载的大量视频。目前,每当需要时,每个视频都会加载到一个新的FLVPlayback实例中,但是我已经读过,也许解决这个问题的最好方法是仅仅拥有一个全局FLVPlayback实例,并将新视频重新加载到旧实例中,应用程序内存中只会有一个FLVPlayback组件。

有没有其他人也遇到过这个问题?您是否找到了比使用全新实例更好的解决方案,您只需重新使用每个新视频?

回答

1

不幸的是,在Flash添加析构函数和显式对象删除之前,您无法帮助解决内存问题。看到这个线程:

Unloading a ByteArray in Actionscript 3

有到闪存的小应用程序有多少可以使用的限制;气相色谱似乎在达到这个极限时开火。我看到我的记忆容易的小程序使用多达〜200MB,只是因为他们跑了几个小时,GC不想踢。

哦,我不认为使用单个实例也是一个优雅的解决方案。目前我只为我的自定义类编写dispose()函数,等待有一天它可以变成适当的析构函数。

0

不幸的是,这就是闪存处理它的方式。不是特别聪明,但它适用于大多数人。

2

我从来没有真正喜欢这些组件,他们有点狡猾。这个特殊的问题似乎很常见,而且正如你所建议的那样,有些恼人的解决方案是只有一个FLVPlayback并重用它。

Here's a blog post about it

1

感谢您的答复,链接到其他博客的问题是有帮助的,以及,我读了所有的垃圾收集格兰特斯金纳的信息太多,但通过这些链接搜索和返回并重新阅读他原先对GC的看法,帮助刷新了旧的头脑。除了将单个FLVPlayback组件零化和重新实例化之外,我还意识到我没有正确地卸载和销毁我的Loader实例,所以我清理了它们,现在程序运行得更加高效。我认为该网站的内存使用率已经提高了约90%。

@aib我会承认单实例解决方案并不优雅,但因为Flash不会放弃那些FLV文件,所以我很困惑它。

@grapefrukt我讨厌闪存组件,它们通常会比保存时间带来更多的悲伤,但在这种情况下,我有很多提示点和导航内容与视频文件进行,FLVPlayback组件是最好的解决方案找到。当然,我还是相当新的动作世界,所以也许我看起来有些东西

我也希望我有声望upvote你的答案,因为他们都有帮助... c'est la vie

1

从我经过大量测试后得到的结果是,flash会根据需要动态加载库和组件,但绝不会垃圾收集该数据。例如,如果我有一个使用FLVPlayback组件的网站或Air应用程序,则在创建新的FLVPlayback()实例之前,不会加载与其关联的实际组件和库。然后它会将库和组件加载到内存中,但在程序/网站关闭之前,您将永远无法获得该空间。只要您从中删除侦听器,将其从视图中移除并将其设置为空,该视频内部的特定实例将收集垃圾并释放一些内存。

此外,如果您正在制作单独的视频,VideoPlayer的重量更轻,清理起来更好。