简介

纹理缓存是将纹理缓存起来方便之后的绘制工作。每一个缓存的图像的大小,颜色和区域范围都是可以被修改的。这些信息都是存储在内存中的,不用在每一次绘制的时候都发送给GPU。

CCTextureCache

Cocos2d通过调用CCTextureCache或者CCSpriteFrameCache来缓存精灵的纹理。

当这个精灵调用CCTextureCache 或 CCSpriteFrameCache的方法的时候,cocos2dx将使用纹理缓存来创建一个CCSprite。所以你可以预先将纹理加载到缓存中,这样你在场景中使用的时候就非常方便了。怎么样加载这些纹理就看你自己的想法。例如,你可以选择异步加载方式,这样你就可以为loading场景增加一个进度条。

当你创建一个精灵,你一般会使用CCSprite::create(pszFileName)。假如你去看CCSprite::create(pszFileName)的实现方式,你将看到它将这个图片增加到纹理缓存中去了:

bool CCSprite::initWithFile(const char *pszFilename)
{
CCAssert(pszFilename != NULL, "Invalid filename for sprite");
CCTexture2D *pTexture = CCTextureCache::sharedTextureCache()->addImage(pszFilename); if (pTexture)
{
CCRect rect = CCRectZero;
rect.size = pTexture->getContentSize();
return initWithTexture(pTexture, rect);
} // don't release here.
// when load texture failed, it's better to get a "transparent" sprite than a crashed program
// this->release();
returnfalse;
}

上面代码显示一个单例在控制加载纹理。一旦这个纹理被加载了,在下一时刻就会返回之前加载的纹理引用,并且减少加载的时候瞬间增加的内存。(详细API请看CCTextureCache API)

CCSpriteFrameCache

CCSpriteFrameCache单例是所有精灵帧的缓存。使用spritesheet和与之相关的xml文件,我们可以加载很多的精灵帧到缓存中,那么之后我们就可以从这个缓存中创建精灵对象了。

和这个xml相关的纹理集一般是一个很大的图片,里面包含了很多小的纹理。下面就是一个纹理集的例子:

有三种方式来加载纹理集到CCSpriteFrameCache中:

  • 加载一个xml(plist)文件
  • 加载一个xml(plist)文件和一个纹理集
  • 通过CCSpriteFrame和一个精灵帧的名字

具体完整API请看CCSpriteFrameCache API。

样例:

CCSpriteFrameCache* cache = CCSpriteFrameCache::sharedSpriteFrameCache(); 

cache->addSpriteFramesWithFile(“family.plist”, “family.png”); 

使用缓存的原因就是减少内存,因为当你使用一个图片创建一个精灵的时候,如果这个图片不在缓存中,那么就会将他加载到缓存中,当你需要用相同的图片来新建精灵的时候,就可以直接从缓存中取得,而不用再去新分配一份内存空间。

CCSpriteFrameCache vs. CCSpriteBatchNode

  • 最好是尽可能的使用spritesheets (CCSpriteBatchNodes)。这样的方式是减少draw的调用次数。Draw的调用是非常耗时的。每一个batchnode调用一次draw就可以绘制上面所有的节点,而不是每一个节点的draw都单独调用一次,
  • CCSpriteBatchNode渲染所有的子节点只需要一次,只需要调用一次draw。那就是为什么你需要把精灵加载batch node的原因,因为可以统一一起渲染。但是只有这个精灵使用的纹理包含在batch node中的才可以添加到batch node上,因为batch node一次只渲染这相同的纹理集。
  • 假如你把精灵添加到其他的节点上。那么每一个精灵就会调用自己的draw函数,batch node就没起作用了。
  • CCSpriteBatchNode也是一个常用节点。你可以从场景中像其他节点一样移除掉。纹理集和精灵帧都被缓存在CCTextureCache 和 CCSpriteFrameCache单例中。假如你想要从内存中移除纹理集和精灵帧,那么你不得不通过缓存类来完成这个工作。

各平台硬件所允许的最大纹理尺寸

按道理来说,Cocos2d-x是可以显示任何大小纹理,但是实际上纹理大小由于硬件和操作系统原因是有限制的。

这里我们提供一个不同平台模拟器上纹理大小限制的表格

platform maxsize in pixels
win32 2048*2048
Android 4096*4096
iPhone3 1024*1024
iPhone3gs 2048*2048
iPhone4 2048*2048

在真实的机器上面,也有一些不同的限制,这里有一些测试结果:G3 1024*1024, iPhone4 2048*2048

因此对于开发者来说,假如你想要跨平台,并且游戏运行流畅,你最好保持你的纹理大小小于1024*1024,这个是大多数机器的限制。

最新文章

  1. 第一天ci框架开发商城1
  2. C#需知--长度可变参数--Params
  3. jQuery 自带的动画效果
  4. iOS Core Animation之CALayer心得
  5. linux下文件结束符
  6. python讲一个列表写入excel表中
  7. The shortest problem
  8. java 图的邻接矩阵
  9. 打破常规——大胆尝试在路由器上搭建SVN服务器
  10. Hash Killer I II
  11. Unable to Rebuild JIRA Index
  12. Java 数据类型转换(转换成字节型)
  13. ubuntu 14.04 下试用Sublime Text 3
  14. 大虾翻译(一):jQuery.extend()
  15. vue组件初学--弹射小球
  16. JSON File Parse
  17. C# 判断网卡类型以及其他网卡信息
  18. SpringMVC 与 REST.
  19. recovery 升级界面顶部花屏问题分析
  20. pubmed_cookie 自动获取

热门文章

  1. Java 类设计----Java类的继承
  2. swift - UIPickerView 的使用
  3. python2.0_s12_day14_jQuery详解
  4. python远程登录服务器(paramiko模块安装和使用)
  5. mysq对存在null值的字段排序
  6. Error setting expression 'XXX' with value 设置表达式“XXX”时出错 解决方法
  7. iOS - UIScrollView xib添加约束的坑
  8. AndroidのListView之滑动列表项(点击事件和滑动事件共存)
  9. ubuntu的两种网络连接模式
  10. JS-缓冲运动-对联型悬浮框