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 的轉換,保證了使用的統一