2014年笔试面试综合相关材料cocos2d-x纹理压缩_第1页
2014年笔试面试综合相关材料cocos2d-x纹理压缩_第2页
2014年笔试面试综合相关材料cocos2d-x纹理压缩_第3页
2014年笔试面试综合相关材料cocos2d-x纹理压缩_第4页
2014年笔试面试综合相关材料cocos2d-x纹理压缩_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

cocos2d-x纹理研通常情况下用PVR格式的文件来进行显示的时候在运行速度和内存消耗方面都要比PNG格PVR消耗的内存比G消耗的内存小5%PVR格式可以用optex导出。PVR是appe能直接和显示的文件.抗锯齿处理。放大时的处理在放大的时候会出现锯齿。纹理类提供了setAntiAliasTexParameters()函数来处理抗锯齿。当放大的时候会使用相邻的四个像素进行混合运算。从而消除锯齿。但是会让产生模糊边的使用的是setAliasTexParameters()。不模糊,但是有锯齿。缩小时的抗锯齿处理使用minmap,缩小时效果会更好,左边使用CCSpriteCCSprite*imgMipMap=CCSprite::create("Images/logo-mipmap.pvr");if(imgMipMap){ (s.width/2.0f-100,s.height/2.0f));//supportmipmapccTexParamstexParams={GL_LINEAR_MIPMAP_LINEAR,GL_LINEAR,GL_CLAMP_TO_EDGE,GL_CLAMP_TO_EDGE};imgMipMap->getTexture()-}cocos2d- 的纹理类支持从多种格式的文件加载.括:.pngjpeg,pvr.gz,webptiff.ccz等格式的文件最大限度的通过一些方法和减小纹理对内存消耗通过CCTexture2D来修改纹理的像素格式,可以减少纹理占用的内存大小和渲染的速度使用16-bit纹最快速地减少纹理内存占用的办法就是把它们作为16位颜色深度的纹理来加载。cocos2d默认的纹有哪些比较有用的纹理像素格式呢generategenerate32-bittextures:kCCTexture2DPixelFormat_RGBA8888(default)generate16-bittextures:kCCTexture2DPixelFormat_RGBA4444generate16-bittextures:generate16-bittextures:kCCTexture2DPixelFormat_RGB565(noGBA8881GB5656位全部用来显示颜色总共有556总颜色值但是这里有个缺点除非是矩形的并且没有透明像素。所以55格式比较适合背景和一些矩形的用户控件。A1格式使用一位颜色来表示alpha通道因此可以拥有透明区域只是位似乎有点不够用它只能表示3268种可用颜色值而且要么只能全部是透明像素或者全部是不透明的像素。因为一位的alpha通道的缘故,所以没有中间值。但是你可以使用fadein/out动作来改变纹理的opacity属性。如果你的包含有半透明的区域,那么A格式很有用。它允许每一个像素值有个aphaGBA888406,所以,RBGA444是6位格式里面颜色质量的。避免一个接一个地加载PNG和JPG纹理(他们之间至少等待一帧coos2d里面纹理加载分为两个阶段.从文件中创建一个UIImage对象2以这个创建好的UIImage对象来创建Cexture2D对象。这意味着,当一个纹理被加载的时候,在短时候内,它(?因为autoeeasepool和计数的关系,临时创建的UIImage对象会被回收)我不是很确定,现在的cocos2d是否仍然如此。或者这种情况是否只适用于手工计数管理,或许ARC不会如此呢?我习惯于按顺序加载纹理,但是在加载下一个纹理之前要等待一帧。这将会使得任何纹理加载的消耗对内存的压力降低因为等待一帧计数会把临时的UIImage对象释放中不要使用jpg来创建纹理对象cocos2d-使用JPG纹理的时候有一个问题。因为JPG纹理在加载的时候,会实时地转化为PNG格式的纹理。这意味着cocos2d-加载纹理是非常慢的(这里有演示),而且JPG纹理内存。现在,如果这个是JPG格式,你会看到这个数字会达到48MB,因为额外的UIImage对象的创建。虽然,最终内存都会降到16M,但是,那一个时刻的内存飙高,足以让os杀死你的游进程,造成crash,影响用户体验JPG不论在加载速度和内存消耗方面都很差。所以,千万不要使用忽视文件大能会GPU所处理,变成我们熟知的纹理。一个2048*2048的png,采用32位颜色深度编码,那么它在磁盘上占用空间只有2MB。但是,如果变成纹理,它将消耗16MB的内存!当然,减少纹理占用内存大小是有办法滴第一个办法就是:上面的条款(1),用SetDefaultAlphaPixelFormat()来实现.尽量使用颜色深度为16bit的。但是条款(1)也提到了,如果本身的颜色深度如果是32位。但是用有解决的办法,庆幸我们有TexturePacker(TP)工具.第二个办法是:使用NPOT纹NOPT是“nonpoweroftwo”的缩写,译作“不是2的幂”。NPOTstandsfor“nonpoweroftwo”.cocos2d1.x的时候,你必须在ccConfig.h文件中开启对NPOT的支持,但是,cocos2d2.x就不需要了,它默认是支持NPOT的。所有3代(3GS)以后的ios设置都支持cocos2d2.x(因为它们支持OpenGLES2.0),所以也都能支持NPOT纹理。纹理。因此,我们会更少地浪费纹理图集的空白区域。而且,这样的纹理在加载的时候,会少使用为什么要关心NPOT呢?因为苹果的OpenGL驱动有一个bug,导致如果使用POT的纹理,则会第三个办法是:默认使用PVR格式的纹TP让你可以创建PVR格式的纹理。除了PVR纹理支持NPOT外,它们不仅可以不是2的幂,而且PVR是最灵活的纹理文件格式除了支持标准的未压缩的RGB格式外不支持有损压缩的pvrtc格式。另外,未压缩的pvr格式的纹理的内存消耗非常地低。不像png那样要消耗2倍于本身内pvr格式的一个缺点就是,你不能在Mac上面打开查看。但是,如果你安装了TP的话,就可以使用TP自带的pvr浏览器来浏览pvr格式的了(强烈建议大家TP,支持TP,不要再盗版使用PVR格式的文件几乎没有缺点。此外,它还可以极大地提高加载速度,后面我会解释到pvr.ccz文件格在三种可选用的pvr文件格式中,优先选择pvr.ccz格式。它是专门为cocos2d和TP设计的。TP里面这是它生成的最小的pvr文件而且pvr.ccz格式比其它任何文件格式的加载速度都要快当在cocos2d里面使用pvr格式的纹理时,只使用pvr.ccz格式,不要使用其它格式!因为它加载当视觉察觉不出来的时候,可以考虑使用PVRTC压PVR纹理支持PVRTC纹理压缩格式。它主要是采用的有损压缩。如果拿PVRTC与JPG作对比的话,它只有JPG中等质量,但是,最大的好处是可以不用在内存里面解压缩纹理。这里把32位的png(左边)与最佳质量的PVRTC4(4位)(点击查看完整的大小)作注意,在一些高对比度的地方,明显有一些瑕疵。有颜色梯度的地方看起来还好一点PVRTC肯定不是大部分游戏想要采用的纹理格式。但是,它们对于粒子效果来说,非常适用。因为预先加载所有的纹存消耗的话(指的是拥有Retina显示的设备,非Retina的减半考虑你可以在第一个loading场如果所有的纹理都加载完毕这时候再出现内存问题那么肯定就与纹理无关了而是其它的问题了按照纹理size从大到小的顺序加载由于加载纹理时额外的内存消耗问题,所以,采用按纹理size从大到小的方式来加载纹理是一个最1MB的纹理和四个占用内存4MBMBMB20MMB4M(44+6*23M(44+16但是,反过来,你先加载16MB的纹理,然后短时候内飙到32MB。然后又降到16MB。这时候,你再依次加载剩下的4个4MB的,这时,最多会彪到(4*3+4*2+16=36)MB。避免在收到内存警告消息的时候清除缓我有时候看到了一种奇怪的“自己打自己的脚”的行为:纹理已经全部在Loading场景里面加载完毕了,这时候,内存警告发生了,然后cocos2d就会把没有使用的纹理从缓存中释放掉。听起来不错,没有使用到的纹理都被释放掉了,但是你刚刚把所有的纹理都加载进来,还没有进入任何一个场景中(此时所有的纹理都被当作“unused”),但是马上被全部从texturecache中移除出去。可是,你又需要在其它场景中使用内存飙高”,又马上收到了内存警告,再释放,再判断,再加载。我的天,这是一个死循环啊!这也能解释为什么有些童鞋,在loading场景完了之后进入下一个场景的时候很卡的原因了。现在,当我收到内存警告的时候,我的做法 什么也不做。内存警告仍然在发生,但是,它只(但)片(比如settings界面,玩家是不经常的。然后,不管什么时候,当我需要某张的时候,我会首先检查一下该spriteframe是否在cache中,如果没有就加载。你会在后面看到具体的做理解在什么时候、在哪里去清除缓你可以使用dumpCachedTextureInfo方法来观察哪些纹理被缓存这个方法的输出如下:(为了清楚起见,我把那些与-hd后缀有关的信息掉了cocos2d:cocos2d:"ingamescorefont.png"rc=9name=ingamescorefont-hd.pngid=13128x64@32bpp=>32KBcocos2d:"ui.png"rc=15name=ui-hd.pngid=52048x2048@16bpp=>8192cocos2d:cocos2d:"ui-ingame.png"rc=36name=ui-ingame-hd.pngid=81024x102416bpp=>2048cocos2d:"digits.png"rc=13name=digits-hd.pngid=10512x64@16bpp64cocos2d:"hilfe.png"rc=27name=hilfe-hd.pngid=61024x2048@32bpp=>8192KBcocos2d:"settings.png"rc=8name=settings-hd.pngid=91024x1024@16bpp=>2048KBcocos2d:"blitz_kurz.png"rc=1name=(null)id=1250x50@32bpp=>9cocos2d:"gameover.png"rc=8name=gameover-hd.pngid=71024x2048@32bpp=>8192KBcocos2d:"home.png"rc=32name=home-hd.pngid=42048x2048@16bpp=>8192KBcocos2d:"particleTexture.png"rc=2name=(null)id=1187x65@32bpp=>cocos2d:"stern.png"rc=2name=(null)id=287x65@32bpp=>cocos2d:32bpp=>.png"rc=60-hd.pngid=11024x2048cocos2d:CCTextureCachedumpDebugInfo:13texturesusing60.1MB(占用的内存大小(bp和每一个被缓存的纹理在内存中所占用大小等这里的“”代表纹理的“计数”如果这个计数等于或的话那么意味着,这个纹理当前可能不会需要使用了,此时,你可以放心地把它从纹理cahe中移除出去。你只移除你知道在当前场景下不太可能会被使用的纹(即上面介绍的计数为或的情况这是一个明智的做法。另外,只移除那些占用内存大的纹理。如果一个纹理只占几个kb的内存,其它(译注:这就和程序优化一样,不要做过多的细节优化,不要过早优化,要找到性能的瓶颈,然后再重点优化,以20的时间换取8%的效率。过早和过多细节优化对于大多数程序而言,是需要极力避免的。SpriteFramesretain上面提到的例子中纹理的计数可能有点让人看不懂你会发现纹理集有很高的retancoun,即使你知道这些纹理集中的纹理当前并没有被使用。SprteFame会rtanspiefame还是保留在内存中。所以,你必须调用SprteFameCache的rmoeSrteFamesFomexture方法,能彻底清除纹理缓存(译注:记住,不是你调用对象的rlease方法了,对象的内存就会被释放掉,而是引用计数为了,内存才会被删除) SpriteFrames非常耗时,每次都是Note:这一点只针对cocos2dv1.0有效cocos2dv2.x在加载之前会预先判断这样看起来有点无知但是,要注意,CCSpriteFrameCache并不会去检查一个精灵帧是否已经被缓存起来了!这与CCTextureCache的动作方式有所不同,它每次都会去加载14帧的plist加载与有280帧的plist加载有着很大的区别。所以,对于精灵帧的加载,你也需要谨所以,你要避免一些不必要的addSpriteFrames*方法调用。因为那边导致场景切换时产生小的卡你可以清除任何缓存(比如animation,spriteframes等,但是请不要轻易清除缓当然如果你想从内存中移除一个纹理你也必须移除与之相关的精灵帧(因为精灵帧会retain纹理。精灵帧对象,那样会导致程序crash。例外:检查声音文件的内存使用请使用MP3格式文件。因为使用没有压缩文件既浪费内存又占用程序大小。当你加载如何避免缓存特定的纹CCTextureCache只不过是对纹理再添加了一次retain函数的调用,这样,当没有其它对象(比如bgbg=[CCSprite//don't//don'tcachethis[[CCTextureCachesharedTextureCache]你需要记住,当你CCTextureCache中移除一个纹理的时候cocos2d下一次在调用spriteWithFile的时候还是会再加载该纹理的--不管是否有没有一张名字一样的正在被其它精NSArray*NSArray*highscores=[AchievementssharedAchievements].highscores;for(HighscoreData*datainhighscores){NSString*entry=[NSStringstringWithFormat:@"%05u",CCLabelAtlas*label=[CCLabelAtlas[labelsNodeaddChild:labelz:10];}//don'tholdontothis上面这个例子是我从highscore场景中抠出来的一旦此场景退出就不应该持有CCLabelAtlas纹理的因此我们需要把它从纹理缓存中移除出去但是你必须防止重复加载纹理到内存中去在其它地方,比如dealloc或者索性让purgecache去做这个事。使用一Loading场oadng实现起来非常简单。这个oadng场景调度一个seecor,然后每一帧(或者0.秒也可以)执行一个函数,比如update。除非你前面一个场景有内存泄漏,否则的话,每一次upate函数执行的时候都会把一些计数为的内存资源释放掉在这个updae方法里面你可以创建新的场景。这样极大地避免了“间歇性内存飙高”的问题,可以极大地减小内存压力在加载纹CCTextureCache类还支持异步加载资源的功能,利用addImageAsync方法。你可以很方面地addImageAsync方法添加一个回调方法,这样,当纹理异步加载结束的时候,可以得到通知程纹理被加载两次!因为异步加载并不能保证加载顺序在加载其它游戏资可是,我们并没有方法来异步加载spriteframes和其它资源。但是们可以借助performSelectorInBackground来实现类似的异步加载的功能 里面的selector方法只接收一个object参数(但是并没有使用。然后就可以在此这方法里面异步-(void)-(void)addSpriteFramesWithFile:@"ui-}这样做最大的好处在于,你加载资源的同时,loadng场景还可以动画,可以添加精灵并运行一些actonCPUcpu的话效果更佳。但是,你需要注意,你不能在线程加载纹理,你必须使用addImageAsync方法。这是因为纹理必须与公共的OpenGLcontext在相同的线程中加载。这样,你就必须先异步加载纹理,然后再去加载spriteframes.你不能依靠CCSpriteFrameCac

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论