cocos2d开发学习五:精灵节点CCSpriteBatchNode的渲染和纹理集Texture Atlases内存优化

cocos2d开发学习五:精灵节点CCSpriteBatchNode的渲染和纹理集Texture Atlases内存优化,第1张

概述http://blog.csdn.net/nono_love_lilith/article/details/7762168 本章其实主要是系统的理解下Sprite精灵节点的创建,然后引入精灵节点和纹理集的概念 CCSprite 最简单的生成方式就是用一个纹理贴图。 [cpp]  view plain copy CCSprite *_firstSp = [CCSprite spriteWithFil

http://blog.csdn.net/nono_love_lilith/article/details/7762168


本章其实主要是系统的理解下Sprite精灵节点的创建,然后引入精灵节点和纹理集的概念

CCSprite 最简单的生成方式就是用一个纹理贴图。

[cpp] view plain copy CCSprite*_firstSp=[CCSpritespriteWithfile:@"icon.png"]; CGSizewins=[[CCDirectorsharedDirector]winSize]; _firstSp.position=ccp(_firstSp.contentSize.wIDth/2,wins.height/2); [selfaddChild:_firstSpz:1];

动画帧

上面是生成精灵的最近基本的一种方式,但是很多时候,

我们的一个精灵元素不会是那种静止,单单只有一帧文件组成,

而以一个精灵帧形式出现。

精灵帧说白了就是一个动画

copy //CCSprite*sp=[CCSpritespriteWithfile:@"ball0.png"]; //step1:首先要有一个精灵对象,当然你也可以用上面的的方式,创建一个初始化纹理的精灵对象。按上面的方法创建的好处是,后面如果你要计算精灵位置时,能获取纹理暂居的空间大小,如果直接node的话,精灵占据空间长宽应该都是0吧。 CCSprite*sp=[CCSpritenode]; sp.position=CGPointMake(200,200); //step2:根据文件名生成两帧文件放入数组 NSMutableArray*frames=[NSMutableArrayarrayWithCapacity:2]; for(inti=0;i<2;i++){ //获取纹理贴图 Nsstring*file=[NsstringstringWithFormat:@"ball%d.png",i]; CCTexture2D*text2d=[[CCTextureCachesharedTextureCache]addImage:file]; //生成精灵帧 CCSpriteFrame*frame=[CCSpriteFrameframeWithTexture:text2drect:CGRectMake(0,text2d.contentSize.wIDth,text2d.contentSize.height)]; //放进数组中 [framesaddobject:frame]; } //step3:生成精灵帧动画动作 CCAnimation*ball=[CCAnimationanimationWithSpriteFrames:framesdelay:0.5]; CCAnimate*animate=[CCAnimateactionWithAnimation:ball]; CCRepeatForever*repeat=[CCRepeatForeveractionWithAction:animate]; //step4:运行动画帧。 [sprunAction:repeat]; [selfaddChild:spz:1];

Tips:

1.这边说一点,该方式获取动画帧是通过文件名然后去资源文件拿去取的,然后资料上什么都会告诉你一般资源的命名规则,就是以0,1,2,3,4结尾,相信大家都懂。

2.cocos2d早期版本,也就是本书所用到的库,还有

/** returns an Animation given it's name. */

-(CCAnimation*)animationByname: (Nsstring*) animationname;

/** adds an Animation to the Sprite. */

-(voID) addAnimation: (CCAnimation*) animation;

就是能把帧动画对象存放到了精灵节点中,同样也可以获取,但是在目前的最新版本中貌似没有了该方法。


精灵节点批处理(CCSpriteBatchNode)

上面都只是针对生成一个精灵节点来说的,有时候我们会遇到场景中需要创建多个相同的精灵,

最原始的方法是我们一个创建,然后add到场景中。

而精灵节点的作用是可以把一些使用相同贴图的精灵放在一起,只进行一次渲染,减少原本我们没创建一个精灵渲染一次而需要消耗的时间。

copy CCSpriteBatchNode*batch=[CCSpriteBatchNodebatchNodeWithfile:@"ball.png"]; [selfaddChild:batch]; inti=0;i<100;i++) { CCSprite*sprite=[CCSpritespriteWithfile:@”ball.png”]; [batchaddChild:bullet]; }
CCSpriteBatchNode简单理解起来很像一个层layer,精灵添加它里面,最后它一次性渲染出来。

1.纹理贴图必须使用同一个文件

2.每个子精灵都是用相同的z-order(深度)。


关于纹理贴图集(Texture Atlases)

简单来说,比如前面我用到两帧动画需要两个图片,

那我们加载两次来从资源文件中读取这两张图片。

为什么说纹理集的作用可以有效减少内存消耗,

这是因为ios在加载图片分配内存大小时会将图片长宽自动缩放到2的N次方,这个很好理解比如16*35的图片,加载到内存是以16*64来的。

因此说用了纹理集能减小内存了,不是说你把几个图片合成到一个一个贴图集里,它就变小了,离乱上来说还是一样大的,只不过纹理集合的话,我们只需加载一次,而如果单个加载,那么加载多次,在这多次加载造成的因“2的N次方”引发的内存消耗显然比只加载一次来的更加危险性了。

贴图纹理集,说简单就是把你原来分散的一个个小图片凭借成一个大图,工具会自动生成一个pList文件来保存每个单元贴图的大小以及以及在贴图中位置信息等。

纹理集制作工具,资料上说用Zwoptex,但是我在论坛搜索到一个“TexturePacker”。有人说要收费,但是貌似下载下来是免费的啊,难道是在appStore下载要收费~

对于贴图纹理集加载

copy @H_403_303@ CCSpriteFrameCache*frameCache=[CCSpriteFrameCachesharedSpriteFrameCache]; [frameCacheaddSpriteFramesWithfile:@"xxxx.pList"];

这样就是把一张纹理集合加载缓存到了内存。

需要用到某个贴图时

copy CCSpriteFrame*frame=[frameCachespriteFrameByname:pngname];
1.资料上说了一种简单估算一个图片会占内存大小,比如一种16*16的,那么占的内存是16*16*4=1kb(应该没错吧。呵呵,资料上说512*512*4 = 1M)。

2.CCSpriteFrameCache加载的是一张拼接过的大图,每一个小图只是大图中的一个区域,这些区域信息都在pList文件中保存。

用的时候只需要根据小图的名称就可以加载到这个区域;

CCTextureCache 是普通的图片缓存,我们所有直接加载的图片都会默认放到这个缓存中,以提高调用效率。

总结

以上是内存溢出为你收集整理的cocos2d开发学习五:精灵节点CCSpriteBatchNode的渲染和纹理集Texture Atlases内存优化全部内容,希望文章能够帮你解决cocos2d开发学习五:精灵节点CCSpriteBatchNode的渲染和纹理集Texture Atlases内存优化所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1060281.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存