2010-09-01 50 views
0

非常奇怪。加载完成顺序仅影响Air 1.5中的swf代码

我们的空中应用程序加载多个swf,它们共同组成了一课。

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

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

在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不允许其他任何事情,并且每次应用程序域也被指定为新域。没有可检测到的域问题 - 没有错误被抛出。

很明显,有些东西是博克。我不相信我的代码中存在这样的事情,因为应用程序在Mac上完美运行,并且仅在PC版本中依赖于加载完成顺序而被破坏,并且只有深层嵌套的代码才会生效。

borked(带有非功能代码的MC)的项目不作为符号导出到库中。

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

一些变化,我将用实验:

1)导出符号管委会与库中的代码,以便它们在帧1加载(Init事件触发之前),即使他们并不需要这个。

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

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

+0

我想看看充满版本的AIR版本。此外,我需要知道您在卫星模块及其AS版本中使用的代码类型。我希望你在Win \ * Nix \ OSX上用最新版本的AIR测试虚拟框中的所有解决方案。并在这里发布所有这些结果。所以我们可以帮助您找到解决方案。并且请把我和你以前的问题联系起来,你在上面谈过。谢谢! – Eugene 2010-09-02 10:57:47

+0

嗨尤金,我不能完整的代码公开,因为它是为NDA客户。 空气版本是1.5.1所有代码是AS3/FP10。 模块使用安全加载方法来访问主安全/应用程序域。 Win和Mac环境均运行Air 2.0.3 未设置appDomain没有区别。 不幸的是,SO似乎删除了我之前的问题。本质上,答案如上 - 串行加载swfs(在开始下一个之前等待INIT)导致应用程序域交叉的主要问题。奇怪的是,在同一时间加载它们,修复它。 – Stray 2010-09-02 14:13:40

+0

迄今为止的数据: 如果加载订单是ACBFED,则A和B都是borked。 C没有borkable的内容,D,E和F都很好。 如果加载顺序是FDBECA一切都很好。 将第一个swf(对INIT)加载的订单以A或B作为第一个swf borked。 F包含与A相同的内容,可以先载入而不会被插入。 为什么? 感激地收到了任何线索。 – Stray 2010-09-03 20:23:00

回答

0

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

加载顺序和破碎的影片剪辑代码都是同样问题的症状:swf没有正确加载到内存中。

中断的swfs通常是最大的,当它们在更小的swfs之前INIT时,它可能是加载不完全的标志,因此与Level-1代码的关联不运行。 (级别0是时间线,级别1是在该时间线上的MC内的代码等)。

经过几百次运行测试,我发现这个问题在Parallels-XP虚拟PC中大约有50%的时间发生,偶尔在Windows 7机器上已经下载到Windows XP(并在许多其他地区打嗝)。到目前为止,它不会发生在Mac上的书专业版bootcamp XP安装,或稳定的Vista安装。

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

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

每个瑞士法郎在第1帧的时间线上包含一行代码,其唯一目的是通知应用程序(通过沙盒桥),第1级代码已正确加载。如果在'COMPLETE'事件触发时没有收到特定swf的通知,则swf被认为已加载不正确,并从内存中卸载并再次加载。

重复此过程直到负载正确。这些文件是本地的,所以延迟给用户是最小的。