【cocos2d 編程精粹】SpriteFrame 的實現與優化

SpriteFrame 的實現與優化

簡介

  SpriteFrame 其實是爲了優化貼圖描畫而存在的。我們知道爲了更好的利用圖形繪製 API,我們常常把一些細小的貼圖合併到一起,然後每次只繪製這張貼圖中需要的那個部分,這個就是 SpriteFrame。

  SpriteFrameCache 是爲了配合 SpriteFrame 而存在的,主要用於載入,管理,緩存 SpriteFrame。   

屬性

  先來解釋幾個概念:

  • set 集合 ,一般對應一個 plist 的數據文件或者數據庫中的一組數據

  • alias 別名,對應了某個 SpriteFrame

  • texture 貼圖,一個 set 一般存在一個貼圖

  • textureName 貼圖名稱,和貼圖一一對應(綁定)

  • SpriteFrame 圖片,指貼圖中的一塊區域

    關係:

  • set : SpriteFrame 是一對多的關係

  • SpriteFrame : alias 是一對多的關係

  • set : texture 是一對一的關係

  SpriteFrame 中有幾個必須的屬性:

  • 貼圖 指定了 圖片 對應的 貼圖

  • 集合名稱 圖片對應的集合的名稱

  • 旋轉 表示了 圖片 是否在 貼圖 中旋轉

  • 貼圖區域 表示 圖片 在 貼圖 中的區域座標

  • 原始尺寸 表示了 圖片 的大小

  • 圖片偏移 表示了實際的 貼圖區域 相對於 圖片 的偏移座標

    注意 當 貼圖 中存在四周透明的情況時,爲了優化大小,貼圖 會去掉這些四周的透明像素,從而使 貼圖區域 和原始尺寸 可能存在不一致的情況。

實現

  SpriteFrame 的實現較爲簡單,暫且略過。

  Cocos2dx 中的 SpriteFrameCache 實現經歷過幾次重大的變化:

  • 1.0.1 使用 CCDictionary 來作爲存儲容器,支持從外部文件讀入

  • 2.0rc2 增加了載入的文件列表

  • 3.0 使用了 map 代替 CCDictionary 來作爲存儲容器

SpriteFrameCache

SpriteFrameCache 實際上就是 spriteFrame 的管理器。主要實現了以下的功能:

  • 載入,從 plist 載入 spriteFrame

  • 管理,對所有的 SpriteFrame 進行統一的管理,可以移出不再使用的

優化

優化大致包括了以後的部分:

代碼風格調整

具體可以參考 項目的風格指南

SpriteFrame 內部計算優化 (未完成)

SpriteFrameCache singleton 模式替換

使用了 kzlib::TSingleton

SpriteFrameCache 內部使用容器替換,原則就是儘量使用 STL 容器

  • set 替換成 unordered_set

  • CCDictionary 替換成 unordered_map

因爲 unordered 系列容器內部使用了 hash 值,因爲比字符串更加有效率。又是 STL 容器,使用方便,穩定高效。

SpriteFrameCache 內部邏輯調整

  • 在 SpriteFrame 內部增加了 setName ,優化了 SpriteFrameCache 對於 set 的管理

  • 優化了 set 的載入和釋放

SpriteFrameCache 支持貼圖創建

支持了從貼圖到 SpriteFrame 的轉換,保證了使用的統一

SpriteFrameCache 支持更多的數據格式 (未完成)

SpriteFrameCache 支持貼圖的後載入 (未完成)

代碼


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章