我正在 AS3 中构建一个远程演示工具。简而言之,一个用户(演示者)可以访问“目录”HTML 页面,其中包含演示文稿中每张幻灯片的链接,并且任意数量的观众可以在另一个页面上观看演示文稿,而该页面又位于每秒轮询服务器以确保其位于正确幻灯片上的 SWF 形式。每当管理员单击目录中的幻灯片链接时,数据库就会更新,并且在下一次请求时,演示文稿 swf 会将其当前显示的幻灯片的标签与从服务器获得的响应进行比较。如果响应与当前标签不同,则 swf 会在时间线中擦洗,直到找到正确的帧标签;否则,它什么也不做,等待下一个轮询结果(一秒钟后)。
每张幻灯片都包含一个带有自己嵌套时间轴的影片剪辑,只要幻灯片显示,该时间轴就会循环播放。没有动作脚本控制任何嵌套的影片剪辑,主时间轴上也没有任何动作脚本,除了stop();
每个关键帧上的 s(每个关键帧都是演示文稿中的幻灯片)。
一切都已构建并完美运行。唯一令人不安的是,如果演示文稿 swf 打开足够长的时间(例如 20 分钟),则轮询开始对任何给定幻灯片上的动画剪辑的帧速率产生显着影响。也就是说,每一秒,持续约十分之三秒的动画帧率都会明显下降,这是非常明显的(因此是整个演示套件的交易破坏者!)。
我知道 AS3 在内存管理方面存在问题,并且我一直在努力重用对象和事件侦听器。代码本身非常简单;有一个Timer
实例每秒触发一次,它触发 anew URLRequest
被 a 加载URLLoader
。被从一个调用到另一个调用URLLoader
重用,而URLRequest
不是(它每次都需要用一个新的缓存终止值初始化,从一个调用中检索到new Date().time
)。在整个类中实例化的唯一对象是Timer
、URLLoader
、各种URLRequests
(应该被垃圾收集),唯一的事件监听器在Timer
(添加一次)、URLLoader
(添加一次),以及在时间线中前后擦洗以找到正确幻灯片的例程(一旦找到正确的幻灯片,它们就会被删除)。
我一直在使用mr doob 的 stats 包来监控内存使用情况,它肯定会随着时间的推移而增长,所以一定会有泄漏(经过一些清理和大约 25 分钟的正常运行时间,它从最初的约 30 MB 增长到 > 200 MB)。
有没有人对可能导致性能问题的原因有任何想法?
更新:我不完全确定性能问题与内存直接相关;我运行演示文稿 swf 的一个实例大约 15 分钟,虽然内存使用量仅攀升至大约 70 MB(并保持在那里),但每隔一秒就会出现明显的打嗝,与轮询调用一致(通过 Firebug 的 Net 面板跟踪)。还有什么可能导致卡顿的电影剪辑?