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