【cocos2d 编程精粹】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
实际上就是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 支持贴图的后载入 (未完成)代码spriteframe.h
spriteframe.cpp
spriteframecache.h
spriteframecache.cpp
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。