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

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

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

有帮助吗?

解决方案

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

在 Actionscript 3 中卸载 ByteArray

Flash 小程序可以使用的内存量是有限的;GC 似乎在达到该限制时就会触发。我发现我的内存小程序使用了约 200MB 的内存,只是因为它们连续运行几个小时而 GC 不想启动。

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

其他提示

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

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

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

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

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

我也希望我能对你们的两个答案都投赞成票,因为它们都很有帮助......这就是生活

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

另外,如果您正在制作单个视频,VideoPlayer 的重量要轻得多,并且清理得更好。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top