1

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

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

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

4

5 回答 5

2

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

这是一篇关于它的博客文章

于 2008-08-25T13:08:52.727 回答
1

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

在 Actionscript 3 中卸载 ByteArray

Flash 小程序可以使用多少内存是有限制的;GC 似乎在达到该限制时触发。我已经看到我的易记忆小程序使用了大约 200MB,只是因为它们连续运行了几个小时并且 GC 不想启动。

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

于 2008-08-25T11:52:04.143 回答
1

感谢您的回复,其他博客问题的链接也很有帮助,我也阅读了格兰特斯金纳关于垃圾收集的所有信息,但是通过这些链接搜索并返回并重新阅读他最初所说的关于 GC 的内容有所帮助刷新旧的脑袋。除了清空和重新实例化单个 FLVPlayback 组件之外,我还意识到我也没有正确卸载和销毁我的 Loader 实例,所以我清理了它们,现在程序运行效率更高了。我想说该站点的内存使用率提高了大约 90%。

@aib 我承认单实例解决方案并不优雅,但是因为 flash 不会放弃那些 FLV 文件,所以我有点坚持。

@grapefrukt 我讨厌 Flash 组件,它们通常会导致更多的悲伤而不是节省的时间,但是在这种情况下,我有很多提示点和导航内容与视频文件有关,而 FLVPlayback 组件是我找到的最佳解决方案。当然,我对动作脚本世界还很陌生,所以也许我忽略了一些东西

我也希望我有声誉来支持你的两个答案,因为它们都很有帮助...... c'est la vie

于 2008-08-25T16:09:02.777 回答
1

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

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

于 2009-12-10T19:36:44.397 回答
0

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

于 2008-08-25T11:54:49.270 回答