我经常在工作时在 Windows 上处理相同的项目,然后在家里使用 Mac。与 Windows 相比,我还看到 Mac 上的一些差异。我发现用于 Mac 的各种 Flash Player 版本通常比 Windows 播放器慢,而且我在 Mac 上看到了一些在 Windows 上没有发生的奇怪行为。
在大多数情况下,我将其范围缩小到 AS3 的垃圾收集。当播放器确定一个对象在电影中不再具有引用时,就会发生垃圾收集,因此它会删除该对象以释放内存。假设你有一个这样的类方法:
function myTweenFunction():void {
var myTween:Tween = new Tween(myDisplayObject, 'x', Strong.easeInOut, 0, 500, 10, true);
myTween.addEventListener(TweenEvent.MOTION_FINISH, onMyTweenDone);
}
上述方法将在 10 秒内将 myDisplayObject 的 x 值从 0 补间到 500。补间完成后,它应该触发 onMyTweenDone 方法(未显示)。但是,myTween 是在 myTweenFunction 内部创建的,因此它只存在于 myTweenFunction 的范围内。当 myTweenFunction 完成时,电影中的任何对象都不再引用 myTween 对象,因此它成为垃圾回收的候选对象。您将开始看到补间,但在某个时间点它会在达到 500 之前停止,并且完成事件不会触发。这意味着 myTween 已被销毁。要解决这个问题,myTween 需要是类的成员,或者只需要在类函数之外有一个引用。
回到 Mac 与 Windows 的问题上,我发现在 Mac 上运行时创建的对象上的垃圾收集比在 Windows 上更明显。垃圾收集发生在 Windows Flash Player 中,但补间和其他事件可能在垃圾收集发生之前完成,因为 Windows Flash Player 具有更好的性能。如果 Mac Flash Player 速度较慢(即相同的补间可能需要更长的时间),则垃圾收集可能会在补间完成之前发生。垃圾收集不会像动画那样逐帧发生;这是一个随时可能发生的后台进程,如果有足够的内存供 Flash Player 使用,则根本不会发生。你的 Windows 机器可能有一堆 RAM,而且电影可以在不需要垃圾收集的情况下正常播放,所以 myTween 可能永远不会消失。如果您的 Mac 内存较少,或者您同时打开了大量应用程序并且 Flash Player 内存分配受到限制,那么 Flash Player 将更频繁地执行垃圾收集。
我也使用了 TimelineMax,并且有一个默认开启的自动垃圾收集功能。尝试关闭它并在 Mac 上测试。
最终,您应该在设计项目时假设用户的内存可能非常有限,因此需要相应地创建、引用和收集对象。