《Cocos2D权威指南》——3.5 CCTexture纹理类「建议收藏」

《Cocos2D权威指南》——3.5 CCTexture纹理类

大家好,又见面了,我是全栈君。

3.5 CCTexture纹理类

游戏运行中,所有图像文件(PNG、PVR)都被加载成GPU可以理解的OpenGL ES纹理,而精灵则对应着这些纹理图。Cocos2D内置一个纹理缓存管理器(CCTextureCache)来保存这些纹理图,这样可以极大加速创建新精灵,并充分利用已有的纹理图。不利的是,如果收到内存警报,Cocos2D会将当前未使用的纹理图(即引用计数为1的纹理图)全部从内存中清除。
首先我们了解一下和纹理相关的概念。
3.5.1 纹理和纹理图集
所有游戏角色都是以图像的形式存储在iPhone和iPad设备的内存中,通常使用的格式是PNG或JPEG。这些图像一旦被加载入内存,它们将以一种未压缩的纹理格式来存储。PNG是苹果官方推荐的用于iOS设备的图像存储格式。
1 . 纹理(Texture)
游戏角色的图像文件在使用前必须解压缩,并转换成iPhone和iPad的GPU可以理解的格式,同时要加载进RAM(随机存储器),这样的图像称为纹理。GPU原生支持一系列压缩格式,如PVRTC,其他格式必须存储为未压缩的图像数据。OpenGL ES可以使用这些数据在屏幕上绘制图像,所使用的PNG图像文件虽然在闪存中不占用多少空间,但是因为要解压缩,所以会在内存中占用更大的空间。
2 . 纹理图集(TextureAtlas)
对于iPhone和iPad设备而言,内存是非常宝贵的。而且iOS设备的GPU使用共享显存,而不是独立显存,换句话说,GPU将使用主系统的内存来存储纹理图和几何图形。旧版iOS设备的内存是128MB。
让这种内存限制更捉襟见肘的是,旧版iOS设备中,图像填充到纹理中时,其长度和宽度必须使用2的乘方。虽然iPhone 3GS和iPhone 4、iPad等设备支持非2的乘方大小的纹理图,但在Cocos2D中,为了兼容所有设备,仍然使用2的乘方来填充纹理。当然,也可以在ccConfig.h文件中修改这一点。
为了节省内存空间,并减少纹理中的浪费空间,将把这些纹理拼合成为一个大的纹理图,称为纹理图集。纹理图集只是一个大的纹理图而已,其中包含所有的图像。想象有一大张纸,然后把自己的照片都贴在上面,在需要时从纸上把照片剪下来。如果想把所有照片一次性给别人,只需给这一大张纸就行,而不需一张张地递过去。OpenGL ES处理图像也是类似,如果使用纹理图集或精灵表单(Spritesheet)把所有图像一次性交给OpenGL ES来处理,比把单个图像逐个交给OpenGL ES处理要高效。
下面大致介绍CCTexture2D、CCTextureCache和CCTextureAtlas这三个纹理类。
3.5.2 CCTexture2D、CCTextureCache和CCTextureAtlas
在Cocos2D中,使用CCTexture2D(纹理)从图片、文本或源数据中创建OpenGL 2D纹理,所创建的纹理对象使用2的乘方来填充。根据创建CCTexture2D对象的方法不同,纹理的真实图片大小可能和纹理大小略有差异。另外需要注意的是,纹理内容通常是上下颠倒的!关于该类的更多内容,可以参考CCTexture2D.h。
CCTextureCache(纹理缓存)作为单例使用,用于加载和管理纹理。一旦纹理加载完成,下次使用时可使用它返回之前加载的纹理,从而减少对GPU和CPU内存的占用。关于该类的更多内容,大家可以参考CCTextureCache.h。
CCTextureAtlas(纹理图集)用来实现纹理图集。纹理图文件可以是PVRTC、PNG或任何Texture2D所支持的文件类型。CCTextureAtlas(纹理图集)可以对纹理图集的矩形进行实时的更新、添加、删除或重排序。关于该类的更多内容,大家可以参考CCTextureAtlas.h。
在Cocos2D的开发中,CCTexture2D和CCTextureCache在多个方法中都有体现,以CCSprite类的初始化方法之一为例:

-(id) initWithFile:(NSString*)filename rect:(CGRect)rect
{
      NSAssert(filename!=nil, @"Invalid filename for sprite");

      CCTexture2D *texture = [[CCTextureCache sharedTextureCache] addImage: filename];
      if( texture )
            return [self initWithTexture:texture rect:rect];
      [self release];
      return nil;
}

以上方法中使用CCTextureCache的单例将图片文件添加到纹理缓存中,并创建一个CCTexture2D纹理对象。如果该纹理对象存在,则使用initWithTexture方法来创建精灵对象。initWithTexture的方法实现如下:

-(id) initWithTexture:(CCTexture2D*)texture rect:(CGRect)rect
{
      NSAssert(texture!=nil, @"Invalid texture for sprite");
      // IMPORTANT: [self init] and not [super init];
      if( (self = [self init]) )
      {
            [self setTexture:texture];
            [self setTextureRect:rect];
      }
      return self;
}

上述方法中指定用于渲染精灵对象的纹理,以及矩形大小。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/108281.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 2021-11-13 2021年煤矿井下电气考试题库及煤矿井下电气考试资料

    2021-11-13 2021年煤矿井下电气考试题库及煤矿井下电气考试资料题库来源:安全生产模拟考试一点通公众号小程序安全生产模拟考试一点通:煤矿井下电气考试题库是安全生产模拟考试一点通总题库中生成的一套煤矿井下电气考试资料,安全生产模拟考试一点通上煤矿井下电气作业手机同步练习。2021年煤矿井下电气考试题库及煤矿井下电气考试资料1、【多选题】短路电流的大小与()有关。(BCDE)A、电动机的额定功率B、电缆的长度C、电缆的截面D、电网电压E、变压器的容量F、电动机的负荷2、【多选题】漏电保护方式主要有()。(ABC)A、附加直流电源式B

  • java 文件转inputstream_把文本转换成表格

    java 文件转inputstream_把文本转换成表格以下是一些将InputStream转换为FileJava示例手动将InputStream复制到FileOutputStreamApacheCommonsIO–FileUtils.copyInputStreamToFileJava1.7NIOFiles.copy1.FileOutputStream1.1我们必须将数据从InputStream手动复…

  • 卡尔曼滤波 — 从推导到应用(一)「建议收藏」

    卡尔曼滤波 — 从推导到应用(一)「建议收藏」前言卡尔曼滤波器是在估计线性系统状态的过程中,以最小均方差为目的而推导出的几个递推数学等式,也可以从贝叶斯推断的角度来推导。本文将分为两部分:第一部分,结合例子,从最小均方差的角度,直观地介绍卡尔曼滤波的原理,并给出较为详细的数学推导。第二部分,通过两个例子给出卡尔曼滤波的实际应用。其中将详细介绍一个匀加速模型,并直观的对比系统状态模型的建立对滤波的影响。

  • 手把手教你设置 IntelliJ IDEA 的彩色代码主题「建议收藏」

    手把手教你设置 IntelliJ IDEA 的彩色代码主题「建议收藏」温馨提示:本教程的GitHub地址为「intellij-idea-tutorial」,欢迎感兴趣的童鞋Star、Fork,纠错。首先,给出一系列IntelliJIDEA代码的彩色主题,供大家选择:VibrantUnknown(Darcula)FadeCommentsNicePythonSolarizedHavenjark

  • c#程序中的AssemblyInfo.cs

    c#程序中的AssemblyInfo.cs在asp.net中有一个配置文件AssemblyInfo.cs主要用来设定生成的有关程序集的常规信息dll文件的一些参数,下面是默认的AssemblyInfo.cs文件的内容具体介绍//是否符合公共语言规范(CLS)[assembly:CLSCompliant(true)]//控制程序集中所有类型对COM的可访问性[assembly:ComVisible(false)]//代码的作者和这…

  • 树莓派是什么?能干什么?

    树莓派是什么?能干什么?树莓派是什么?能干什么?一、什么是树莓派?二、树莓派和单片机的区别?三、树莓派使用的什么系统?四、树莓派的最基本操作方法?五、树莓派能干什么?六、玩树莓派能学到什么?一、什么是树莓派?树莓派是由树莓派基金会发布的卡片式电脑,起初的目的是为了让更多的孩子们可以学习计算机编程,但是发布以后受到了广大计算机爱好者的喜爱树莓派被称为卡片式电脑,顾名思义它可以安装操作系统,并且接上显示屏鼠标键盘就可以正常使用,在上面可以用python或者C语言编程并运行。二、树莓派和单片机的区别?树莓派是卡片式电脑可以装

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号