我正在 AS3 中构建一个远程演示工具。简而言之,一个用户(演示者)可以访问“目录”HTML 页面,其中包含演示文稿中每张幻灯片的链接,任意数量的观众可以在另一个页面上观看演示文稿,而该页面又位于每秒轮询一次服务器以确保它在正确的幻灯片上的 SWF 格式。每当管理员单击 TOC 中的幻灯片链接时,数据库都会更新,并且在下一次请求时,演示文稿 swf 会将当前显示的幻灯片标签与从服务器获得的响应进行比较。如果响应与当前标签不同,则 swf 会在时间轴上进行擦洗,直到找到正确的帧标签;否则,它不执行任何操作并等待下一个轮询结果(一秒后)。
每张幻灯片都包含一个动画片段,该动画片段具有自己的嵌套时间轴,只要显示幻灯片就会循环播放。没有控制任何嵌套动画片段的 ActionScript ,除了每个关键帧上的 stop();
之外,主时间线上也没有任何 ActionScript (每个关键帧都是演示文稿中的幻灯片)。
一切都已构建并完美运行。唯一麻烦的是,如果演示文稿 swf 打开的时间足够长(比如 20 分钟),轮询开始对在任何给定幻灯片上动画的动画片段的帧速率产生明显影响。也就是说,每一秒,动画的帧率都会明显下降,持续大约十分之三秒,这是非常明显的(因此是整个演示套件的一个交易破坏者!)。
我知道 AS3 在内存管理方面存在问题,并且我一直在努力重用对象和事件监听器。代码本身非常简单;有一个每秒触发的 Timer
实例,它会触发 new URLRequest
由 URLLoader
加载。 URLLoader
在调用中重复使用,而 URLRequest
不是(每次都需要用新的缓存终止值初始化,从调用 new Date().time
).整个类中唯一实例化的对象是 Timer
、URLLoader
、各种 URLRequests
(应该被垃圾回收),以及只有事件监听器位于 Timer
(添加一次)、URLLoader
(添加一次)以及在时间轴中前后擦洗以找到正确幻灯片的例程(一旦找到正确的幻灯片,它们就会被删除)。
我一直在使用 mr doob's stats package监控内存使用情况,内存使用情况肯定会随着时间的推移而增长,因此一定存在泄漏(经过一些清理和大约 25 分钟的正常运行时间后,它从最初的 ~30 MB 增长到 > 200 MB)。
是否有人对可能导致性能问题的原因有任何想法?
更新:我不完全确定性能问题是否与内存直接相关;我运行了演示文稿 swf 的一个实例大约 15 分钟,虽然内存使用率仅攀升至 70 MB 左右(并保持在那里),但以一秒的间隔开始出现明显的打嗝,与轮询调用一致(通过 Firebug 的网络面板跟踪) ).还有什么可能导调用影剪辑卡顿?
最佳答案
我知道这有点晚了,但我经常使用 Flash Builder 的分析器,我发现一件事是计时器类生成的 TimerEvent
- 单独使用相当多的内存
- 似乎在垃圾收集期间没有正确释放(即使您停止了计时器并删除了对它的所有引用)。
每个 Timer
节拍都会生成一个新事件。我改用 setInterval
,尽管一些 AS3 布道者似乎反对这样做。我不知道为什么。 setInterval
仍会生成计时器事件,但随着时间的推移它们似乎会被正确地垃圾回收。
所以一个策略可能是
- 您用
setInterval()
调用替换了 Timer ...无论如何,这可以说是更健壮的代码,并且 - (注意)在每次滑动擦洗时强制进行垃圾收集(但不是在每次轮询时)。参见 this question有关优缺点的更多详细信息。
第二个建议只是权宜之计。我真的鼓励您使用分析工具来查找泄漏。 Flash Builder Pro 有 60 天的试用期,可能会有所帮助。
最后,当移动到全新的幻灯片 SWF(不是当前幻灯片中的新时间轴位置)时,您如何确保上一张幻灯片 SWF 已正确卸载?还是我误解了您的设置,只有一个实际的幻灯片 SWF?
关于actionscript-3 - ActionScript 3 : Memory Leak in Server Polling Presentation App,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2314538/