【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 支持贴图的后载入 (未完成)
代码
spriteframe.h
spriteframe.cpp
spriteframecache.h
spriteframecache.cpp
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
文章标题:【cocos2d编程精粹】SpriteFrame的实现与优化-创新互联
标题链接:http://ybzwz.com/article/dhcpoh.html