SpriteFrame
實際上是爲了優化貼圖描畫而存在的。咱們知道爲了更好的利用圖形繪製 API,咱們經常把一些細小的貼圖合併到一塊兒,而後每次只繪製這張貼圖中須要的那個部分,這個就是 SpriteFrame。git
SpriteFrameCache
是爲了配合 SpriteFrame
而存在的,主要用於載入,管理,緩存 SpriteFrame
。 github
先來解釋幾個概念:數據庫
set
集合 ,通常對應一個 plist
的數據文件或者數據庫中的一組數據緩存
alias
別名,對應了某個 SpriteFrame
ide
texture
貼圖,一個 set
通常存在一個貼圖優化
textureName
貼圖名稱,和貼圖一一對應(綁定)ui
SpriteFrame
圖片,指貼圖中的一塊區域spa
關係:code
set
: SpriteFrame
是一對多的關係orm
SpriteFrame
: alias
是一對多的關係
set
: texture
是一對一的關係
SpriteFrame 中有幾個必須的屬性:
貼圖
指定了 圖片
對應的 貼圖
集合名稱
圖片對應的集合的名稱
旋轉
表示了 圖片
是否在 貼圖
中旋轉
貼圖區域
表示 圖片
在 貼圖
中的區域座標
原始尺寸
表示了 圖片
的大小
圖片偏移
表示了實際的 貼圖區域
相對於 圖片
的偏移座標
注意 當 貼圖
中存在四周透明的狀況時,爲了優化大小,貼圖
會去掉這些四周的透明像素,從而使 貼圖區域
和原始尺寸
可能存在不一致的狀況。
SpriteFrame
的實現較爲簡單,暫且略過。
Cocos2dx 中的 SpriteFrameCache
實現經歷過幾回重大的變化:
1.0.1
使用 CCDictionary
來做爲存儲容器,支持從外部文件讀入
2.0rc2
增長了載入的文件列表
3.0
使用了 map
代替 CCDictionary
來做爲存儲容器
SpriteFrameCache
實際上就是 spriteFrame
的管理器。主要實現瞭如下的功能:
載入,從 plist
載入 spriteFrame
管理,對全部的 SpriteFrame 進行統一的管理,能夠移出再也不使用的
優化大體包括了之後的部分:
具體能夠參考 項目的風格指南
使用了 kzlib::TSingleton
set 替換成 unordered_set
CCDictionary 替換成 unordered_map
由於 unordered 系列容器內部使用了 hash 值,由於比字符串更加有效率。又是 STL 容器,使用方便,穩定高效。
在 SpriteFrame 內部增長了 setName
,優化了 SpriteFrameCache 對於 set
的管理
優化了 set 的載入和釋放
支持了從貼圖到 SpriteFrame 的轉換,保證了使用的統一