FLVPlayback组件内存问题
我的网站完全基于Flash,它围绕3D模型移动,该模型是作为我转换为FLV文件的视频片段提供给我的。我正在使用FLVPlayback组件来控制程序内部的视频。使用System.totalMemory运行内存检查时,我注意到,每当加载视频时,它都会吃掉一块内存,即使当我从其中删除所有事件监听器(它们都被弱引用)时,也要从中删除该组件。它的父级,停止视频并使该组件实例为空,它仍将不退还该内存。
自从我开始从事这个项目以来,这一直困扰着我,因为用户可以实例化和加载大量视频。当前,每当需要时,每个视频都被加载到新的FLVPlayback实例中,但是我已经读到,解决此问题的最佳方法可能就是简单地拥有一个全局FLVPlayback实例,然后将新视频重新加载到旧实例中。应用程序的内存中将只有一个FLVPlayback组件。
还有其他人也遇到这个问题吗?我们是否找到了比仅对每个新视频都重复使用的全局实例更好的解决方案?
解决方案
回答
不幸的是,直到Flash添加析构函数和显式对象删除后,我们才能解决很多内存问题。看到这个线程:
在ActionScript 3中卸载ByteArray
Flash applet可以使用多少内存是有限制的。 GC似乎会在达到该限制时触发。我已经看到我容易记忆的applet会使用多达200MB的内存,只是因为它们连续运行了数小时,并且GC不想参与其中。
哦,我也不认为使用单个实例是一种优雅的解决方案。目前,我只是为自定义类编写一个dispose()函数,等待一天可以将其转化为适当的析构函数。
回答
不幸的是,这就是Flash处理它的方式。并不是特别聪明,但是它对大多数人有效。
回答
我从来没有真正喜欢过这些组件,它们有点狡猾。这个特殊的问题似乎很常见,而且,正如我们所建议的那样,有点烦人的解决方案是只有一个FLVPlayback并重用它。
这是关于它的博客文章
回答
感谢答复,指向其他博客问题的链接也很有用,我也阅读了Grant Skinner关于垃圾收集的所有信息,但是搜索这些链接并返回并重新阅读他最初对GC的看法有助于刷新旧的noggin。除了将单个FLVPlayback组件置零并重新实例化之外,我还意识到我也没有正确地卸载和销毁我的Loader实例,因此我对其进行了清理,现在程序运行效率更高。我想说该站点的内存使用量已提高了90%左右。
@aib我将承认单实例解决方案不是很好,但是由于Flash不会放开那些FLV文件,因此我有点受其困扰。
@grapefrukt我讨厌Flash组件,它们通常造成比节省时间更多的麻烦,但是在这种情况下,视频文件上存在很多提示点和导航内容,而FLVPlayback组件是我发现的最佳解决方案。当然,我对动作脚本世界还算陌生,所以也许我忽略了一些东西
我也希望我有幸能对两个答案都予以支持,因为它们都对我们有帮助... c'est la vie
回答
经过大量测试后,我得出的结论是,闪存会根据需要动态加载库和组件,但绝不会垃圾收集该数据。例如,如果我有一个使用FLVPlayback组件的网站或者Air应用程序,则在创建新的FLVPlayback()实例之前,不会加载与之关联的实际组件和库。然后它将被加载到库和组件中到内存中,但是在程序/网站关闭之前,我们永远不会收回该空间。只要我们从其中删除侦听器,将其移出舞台并将其设置为null,该特定实例(其中包含视频)就会被垃圾收集并释放一些内存。
另外,如果我们要制作单个视频,则VideoPlayer的重量更轻,并且清理效果更好。