加载完成顺序仅影响PC上Air 1.5中的swf代码

时间:2010-09-01 19:49:52

标签: actionscript-3 air flash

非常奇怪。

我们的空中应用程序会加载多个swfs,它们共同构成了一个教训。

如果我们加载串行而不是并行,那么所有swfs中的代码都会被破坏。 (在这个问题上有一个先前的stackoverflow q)。如果它们并行加载,则所有时间轴顶级代码都可以正常工作。

在Mac上,所有代码都可以正常工作,包括在MC内部的MC内部深层嵌套的代码,无论swfs的加载顺序如何完成和进入。

在PC上,顶级(每个swf时间轴)代码始终有效,但深度嵌套代码的运行取决于swfs加载完成和输入的顺序。

将swfs称为A,B,C和D,如果init顺序为A,B,C,D,则swf A中的代码(仅深度嵌套的代码)不起作用 - 即使stop()不起作用。这只发生在PC上。

如果swfs初始化顺序为B,A,C,D或者甚至是C,B,A,D,那么一切都是应该的。 (识别这种模式的过程相当漫长!)

有时候不止一个装载的瑞士法郎存在问题 - 我无法在这背后发现明显的模式。

所有4个swfs都可以作为独立运行。所有4个swfs在Mac版本中运行良好。所有4个swfs应该加载到他们自己的应用程序域中,因为Air不允许任何其他内容,并且每次都将应用程序域指定为新域。没有可检测到的域问题 - 没有错误被抛出。

显然有些东西被塞住了。我不相信borked的东西在我的代码中,因为应用程序在Mac上完美运行,并且仅在PC版本中依赖于加载完成顺序而被破坏,并且只有深层嵌套的代码才会被打开。

borked的项目(具有无效代码的MC)不会作为符号在库中导出。

有没有人遇到过这个,或类似的东西?

我将尝试的一些变体:

1)使用库中的代码导出MC的符号,以便它们在frame1中加载(在init事件触发之前),即使它们不需要它。

2)不是手动指定应用程序域,而是让它默认(为相同的值)

我会在这里记录我的发现。任何人都可以想到其他任何值得改变的东西,看看是否有影响?

1 个答案:

答案 0 :(得分:0)

我想我找到了问题的根源。

加载顺序和损坏的动画片段代码都是同一问题的症状:swf没有正确加载到内存中。

破坏的swfs通常是最大的,当它们在更小的swfs之前进行INIT时,它可能是不完整加载的标志,因此与Level-1代码的相关性没有运行。 (Level-0是时间轴,level-1是该时间轴上MC内的代码等)。

经过数百次测试后,我发现Parallels-XP虚拟PC中大约有50%的时间出现此问题,偶尔也会出现在Windows 7上已经下载版本的Windows 7上(和许多其他领域的打嗝)。到目前为止,它不会发生在Mac book pro bootcamp XP安装或稳定的Vista安装上。

我猜这是Air应用程序中的真正线程崩溃,很可能是某种内存问题?

我无法找到防止问题发生的方法。相反,我有一个解决方法:

每个swf在第1帧的时间轴上包含一个MC,其中包含一行代码,其唯一目的是通知应用程序(通过沙箱桥)正确加载了第1级代码。如果在“COMPLETE”事件触发时未收到特定swf的通知,则认为swf未正确加载,并从内存中卸载并再次加载。

重复此过程直到负载正确。这些文件是本地的,因此对用户的延迟很小。