2010-09-01 51 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被認爲已加載不正確,並從內存中卸載並再次加載。

重複此過程直到負載正確。這些文件是本地的,所以延遲給用戶是最小的。