2011-05-20 41 views
0

我有一個大型的Flash項目,我試圖找出處理它的最佳方法。我想加載一個包含組及其成員的XML文件,以及與每個組及其成員相關的一組屬性 - 但這些組和成員僅在用戶單擊其父組後才顯示在屏幕上。我的第一個想法是隻爲整個組織和用戶提供XML,然後爲這些組分配電影剪輯,並附上與其顯示相關的屬性以及用戶如何與它們交互 - 但如果它們可能永遠不會出現屏幕,這樣做沒有意義嗎?我如何最好地組織這個項目?構建一個對象並僅將屬性附加到該對象,然後僅在點擊時添加顯示數據?顯示大型XML文檔中包含的數據

我曾經嘗試過建立過這個過程,它在中途變得太笨重,所以我想用一種可靠的方法開始新鮮。任何建議表示讚賞。

回答

1

所以對這類問題沒有「一個真實的答案」不過,我可以給你一些建議,告訴我如何解決這個問題。

首先,您將需要加載和分析整個XML文檔;您將希望在一次傳遞中將數據轉換爲ActionScript 3對象(又名模型對象),然後丟棄XML對象;這樣做的原因是因爲accessing properties of an XML Object in AS3 is very, very slow。編寫解析器非常簡單, (順便說一下:我已經寫了一篇關於marshalling data to and from XML的相當深入的博客文章);對於這個答案的緣故,讓我們假設你有一個XML文件,它看起來有點像這樣:

<group name="AS3 Developers"> 
    <member name="jonnyreeves" rep="440" /> 
    <member name="mheavers" rep="243" /> 
</group> 

最局部模型對象圖將包括一個Group模型和Member型號,如:

public class Group { 
    public var name : String; 
    public var members : Array; /* of Member objects */ 
} 

public class Member { 
    public var name : String; 
    public var rep : uint; 
} 

一旦你的分析器在XML文檔上發揮了神奇的作用,你應該留下一個Group對象數組;這應該然後被存儲在一個新的模型,它可以爲您提供快捷方便地訪問到它包含的數據:

public class GroupListModel { 
    private var _groups : Array; 

    public function GroupListModel(groups : Array) { 
     _groups = groups; 
    } 

    public function getGroup(name : String) : Group { 
     // TODO Use a lookup table here instead. 
     for each (var group : Group in _groups) { 
      if (group.name == name) { 
       return group; 
      } 
     } 
     return null; 
    } 

    public function getMembersWithRepGreaterThan(value : uint) : Array { 
     const result : Array = []; 
     for each (var group : Group in _groups) { 
      for each (var member : Memeber in group) { 
       if (member.rep > value) { 
        result.push(member); 
       } 
      } 
     } 
     return results; 
    } 
} 

這樣就可以把所有的檢索(修改)的GroupListModel內部方法;改善encapsulation

因此,至於顯示它們 - 這取決於你如何計劃向用戶展示它們。我同意,如果存在大量DisplayObject,那麼您不想過度創建與會員相關聯的所有DisplayObject,否則由於DisplayObject的複雜性,創建DisplayObject會很昂貴。

有幾種方法你可以採取,通過分頁的內容,你可以使用ItemRenderer風格的方法,其中的實例只創建時,當他們是必需的。另一種選擇是使用具有可重置的View對象,這些對象可以放置在ObjectPool以供以後重新使用。哪種方法最終會導致我將推薦保持金科玉律 - 保持簡單 - 先讓它工作,然後再考慮性能和內存使用情況。

最後,我沒有提到有框架來幫助解決這些架構問題,最受歡迎的兩個是PureMVCRobotLegs;我建議你花一些時間學習如何工作,如果你有興趣改進你的工藝。

+0

這太棒了,謝謝。 – mheavers 2011-05-24 15:33:44

2

我要做的是加載XML並將其緩存在未解析的模型級別上,以消除用戶交互的加載時間,但在點擊時執行所有解析,創建和呈現操作以便按需提供。

+0

如何將其緩存在模型級別上? – mheavers 2011-05-20 15:27:35

+0

這隻適用於使用MVC框架的情況,但如果不只是忽略這一點,則重要的一點是,onLoad時不應該解析XML,只需保留引用以將其保留在內存中並執行所有操作在相關的用戶交互發生時解析和創建MovieClip! – dain 2011-05-20 15:31:36