3

我正在 AS3 中构建一个远程演示工具。简而言之,一个用户(演示者)可以访问“目录”HTML 页面,其中包含演示文稿中每张幻灯片的链接,并且任意数量的观众可以在另一个页面上观看演示文稿,而该页面又位于每秒轮询服务器以确保其位于正确幻灯片上的 SWF 形式。每当管理员单击目录中的幻灯片链接时,数据库就会更新,并且在下一次请求时,演示文稿 swf 会将其当前显示的幻灯片的标签与从服务器获得的响应进行比较。如果响应与当前标签不同,则 swf 会在时间线中擦洗,直到找到正确的帧标签;否则,它什么也不做,等待下一个轮询结果(一秒钟后)。

每张幻灯片都包含一个带有自己嵌套时间轴的影片剪辑,只要幻灯片显示,该时间轴就会循环播放。没有动作脚本控制任何嵌套的影片剪辑,主时间轴上也没有任何动作脚本,除了stop();每个关键帧上的 s(每个关键帧都是演示文稿中的幻灯片)。

一切都已构建并完美运行。唯一令人不安的是,如果演示文稿 swf 打开足够长的时间(例如 20 分钟),则轮询开始对任何给定幻灯片上的动画剪辑的帧速率产生显着影响。也就是说,每一秒,持续约十分之三秒的动画帧率都会明显下降,这是非常明显的(因此是整个演示套件的交易破坏者!)。

我知道 AS3 在内存管理方面存在问题,并且我一直在努力重用对象和事件侦听器。代码本身非常简单;有一个Timer实例每秒触发一次,它触发 anew URLRequest被 a 加载URLLoader。被从一个调用到另一个调用URLLoader重用,而URLRequest不是(它每次都需要用一个新的缓存终止值初始化,从一个调用中检索到new Date().time)。在整个类中实例化的唯一对象是TimerURLLoader、各种URLRequests(应该被垃圾收集),唯一的事件监听器在Timer(添加一次)、URLLoader(添加一次),以及在时间线中前后擦洗以找到正确幻灯片的例程(一旦找到正确的幻灯片,它们就会被删除)。

我一直在使用mr doob 的 stats 包来监控内存使用情况,它肯定会随着时间的推移而增长,所以一定会有泄漏(经过一些清理和大约 25 分钟的正常运行时间,它从最初的约 30 MB 增长到 > 200 MB)。

有没有人对可能导致性能问题的原因有任何想法?

更新:我不完全确定性能问题与内存直接相关;我运行演示文稿 swf 的一个实例大约 15 分钟,虽然内存使用量仅攀升至大约 70 MB(并保持在那里),但每隔一秒就会出现明显的打嗝,与轮询调用一致(通过 Firebug 的 Net 面板跟踪)。还有什么可能导致卡顿的电影剪辑?

4

2 回答 2

0

我脑子里只有两件事:

  • 根据 Flash 播放器的版本和 CPU 使用情况,垃圾收集有时不会消耗 250 MB(甚至更多)内存之前开始。
  • Moviesclips、Sprites、Loader 和任何有 Eventlistener 监听的东西都不会被垃圾收集杀死。

所以我相信你的问题是,幻灯片或装载机在使用后没有正确清洁,所以它们被保存在内存中。

开始阅读的好点:http ://www.gskinner.com/blog/archives/2006/06/as3_resource_ma.html

于 2010-02-26T14:24:35.013 回答
0

我知道这有点晚了,但是我一直在经常使用 Flash Builder 的分析器,我发现的一件事是TimerEvent计时器类生成的

  1. 单独使用相当多的内存并且
  2. 在垃圾收集期间似乎没有正确释放(即使您停止了计时器并删除了对它的所有引用)。

每次报价都会生成一个新事件Timer。我setInterval改用它,尽管一些 AS3 布道者似乎反对这样做。我不知道为什么。setInterval仍然会生成计时器事件,但随着时间的推移,它们似乎会被正确地收集起来。

所以一种策略可能是

  1. 您将 Timer 替换为对setInterval()... 的调用,无论如何这可以说是更健壮的代码,并且
  2. (注意)在每次滑动擦洗时强制进行垃圾收集(但不是在每次轮询时)。有关利弊的更多详细信息,请参阅此问题。

第二个建议只是权宜之计。我真的鼓励您使用分析工具来查找泄漏。Flash Builder Pro 有一个 60 天的试用期,可能会有所帮助。

最后,当移动到一个全新的幻灯片 SWF(不是当前幻灯片中的新时间线位置)时,您如何确保正确卸载前一张幻灯片 SWF?还是我误解了您的设置并且只有一张实际的幻灯片 SWF?

于 2010-04-19T13:56:09.243 回答