地圖編輯器幾種實現的總結

poplarbbs發表於2010-03-04

地圖編輯器中最重要的效能問題出現在編輯區域顯示上。編輯的地圖可能超過 AS3 BitmapData 支援的30000X30000,並且需要支援多層、選取、複製、貼上等功能。所以在顯示上肯定需要採取某種手段節約效能。

 

先介紹一下地圖的基本資訊:地圖是由許多個 Tile 組成的,地圖編輯器就是將資源的 Tile 貼上到地圖中,並由編輯器將相應資源顯示在相應位置。

 

以下是我慘痛的試錯經歷:

 

  1. 採用最原始的方式,每個單元格一個 Sprite。 Sprite 的數目與map 數目相同。 Sprite 內部分成多層,包括畫邊框、顯示選取區域、顯示單元格型別等,使用Shape實現。
    優點:可以超過 BitmapData 的大小限制
    缺點:效能非常差,但層100 X 100 就已經很卡了。隨著數目的增大,很可能造成程式崩潰。
  2. 參考之前一個js專案的方式,格子仍然使用 Sprite, 但只生成螢幕能顯示的部分。當某個各自移動到螢幕外的時候,則立即移動到螢幕的另一側,並渲染成新的內容,等待進入螢幕。這種方式我稱為 Flow,有點類似傳送帶的運作方式。
    優點:比上一種方式效能有所提高,就算格子數目很大也不會崩潰。每次只需要渲染一行或者一列單元格的內容,進一步節省資源。
    缺點:雖然不至於崩潰,效能依然很差。
  3. 使用 BitmapData 實現,是目前效能最好的實現方式。在一個比螢幕略大的 BitmapData 上操作畫素,當滾動條滾動的時候會自動拷貝新的畫素到 BitmapData 並移動這塊 BitmapData,使得相對位置適中保持在與螢幕同步。
    優點:效能無與倫比
    缺點:如此一來只能以畫素級別操作,而不能使用單元格級別渲染
  4. 目前使用的方式,將第二步的 Sprite 變成非現實物件,將要顯示的內容拷貝到整塊地 BitmapData之上。以此來提高效能並支援以格為單位的渲染。
    優點:支援格級別渲染,如此渲染的次數實際上比方法3還要少得多
    缺點:不能兼顧方法2的值渲染移行或者一列單元格的方式,需要將顯示部分全部重新渲染。

目前就先“錯”到這裡,經過這個小程式的開發,深刻理解到現實物件實際上是稀缺資源,不可以濫用。

相關文章