2011-07-11 53 views
3

我们的Flash游戏每天运行将近4000个用户,大约2%的用户获得脚本停止(错误#1502和#1503上的Flash异常)。我们知道这些错误正在发生,因为我们使用Flash Player 10 uncaughtErrorEvents功能来捕获并记录这些异常。这些无法解释的脚本停顿异常是什么?

我们还记录了一个函数调用历史记录,所以我们可以看到这个异常总是出现在ActionScript3代码的不同位置,当然通常出现在运行频率最高的代码部分。

我99%肯定我们的代码没有卡在一个无限循环中,我知道这个错误最初是为了什么。

我怀疑发生的事情是,用户运行在一台非常慢的机器上,并且闪存正在进行垃圾回收或其他事情,这导致了失速。 Flash然后检测到代码长时间执行并放弃,因为它超过了Flash发布设置中设置的脚本时间限制。我们目前已经将此设置为20秒,对于我们的任何代码来说,在一台体面的机器上运行应该足够了。

有没有其他人遇到过类似的问题?使用了哪些解决方案,将脚本时间限制设置为一些庞大的数字,我们可能只需要做些什么?

+1

很可能玩家们正在打开大量的标签并拖延他们的浏览器。此外,它可能是加入阻止这样做,虽然这是一点点strech ...即你没有多少/应该做的除了试图复制... – Neoraptor

回答

2

这听起来像是一个页面文件挂起慢速计算机随机撞击的踢。

您的闪存包含在浏览器内。存储在内存中。 现在,当用户需要更多的内存时,他们就可以说windows - 内存的数据作为'页面文件'内的'虚拟内存'存储在硬盘的一部分中,允许它们运行尽可能多的应用程序立刻。

这是一切都很好,但它意味着如果您的Flash正在工作的线程,无论出于何种原因已被部分移动或整体移动到虚拟内存,则每次更新都必须轮询硬盘驱动器以访问内存。

与实际RAM(随机存取存储器)相比,硬盘速度较慢,速度很慢,并且因为它们的优先级如此之慢,所以总是。因为它只能从硬盘中读取才能更新,所以会挂起。由于Flash知道如果更新没有被调用一段时间(通常当一个脚本停留在循环中),它会抛出你收到的错误。

我看到导致这种事情的最大错误是存在内存泄漏。通常以“被认为已被删除,垃圾收集对象”的形式出现。尝试在调试运行中分析内存并播放几个小时,检查内存负载是否增加,因为您一遍又一遍地做同样的事情。关注数组大小,寻找诸如从屏幕上移除但从未被删除(从而保存在内存中)的影片剪辑等内容。书写不佳的菜单经常遭受这种困境。

有时候,陷入困境的电脑根本无法跟上每帧处理的速度,而像杀毒软件这样的东西会启动系统扫描(占用内存),这会更加真实地适应您的零星处理数据。

+0

另外,如果你想发布一些特定的行似乎围绕我们可以帮助提供更好的诊断的错误聚集。 –