cocos2d-x如何优化内存的应用_移动开发_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > 移动开发 > cocos2d-x如何优化内存的应用

cocos2d-x如何优化内存的应用

 2014/8/25 21:22:36  xiaochao1234  程序员俱乐部  我要评论(0)
  • 摘要:自身以前也写过cocos2d-x如何优化内存的应用,以及内存不够的情况下怎么样处置惩罚游戏。今天在微博中看到有友好简介了下内存,挺详细的。不晓得是谁写的,我纪录下。一,IOS与图片内存在IOS上,图片会被积极缩放到2的N次方大小。例如一张1024*1025的图片,占用的内存与一张1024*2048的图片是一致的。图片占用内存大小的共计的公式是;长*宽*4。何等一张512*512占用的内存即是512*512*4=1M。其他尺寸以此类推。(ps:IOS上支持的最大尺寸为2048*2048)。二
  • 标签:应用 优化 内存

自身以前也写过cocos2d-x如何优化内存的应用,以及内存不够的情况下怎么样处置惩罚游戏。今天在微博中看到有友好简介了下内存,挺详细的。不晓得是谁写的,我纪录下。

一,IOS与图片内存 在IOS上,图片会被积极缩放到2的N次方大小。例如一张1024*1025的图片,占用的内存与一张1024*2048的图片是一致的。图片占用内存大小的共计的公式是;长*宽*4。何等一张512*512 占用的内存即是 512*512*4 = 1M。其他尺寸以此类推。(ps:IOS上支持的最大尺寸为2048*2048)。   二,cocos2d-x 的图片缓存 Cocos2d-x 在机关一个精灵的时辰会运用spriteWithFile或者spriteWithSpriteFrameName等 岂论用哪类方式,cocos2d-x都会将这张图片加载到缓存中。若是是第一次加载这个图片,那就会先将这张图片加载到缓存,往后从缓存读取。假如缓存中已经存在,则直接从缓存中提取,免去了加载进程。   图片的缓存主要由下列两个类来措置:CCSpriteFrameCache, CCTextureCache   CCSpriteFrameCache加载的是一张拼接过的大图,每个小图只不过大图中的一个地域,这些地域信息都在plist文件中生存。用的时辰只重要根据小图的称号便可以加载到这个区域。   CCTextureCache 是寻常的图片缓存,我们所有直接加载的图片都会默许放到这个缓存中,以行进挪用听从。 因而,每次加载一张图片,或者颠末plist加载一张拼接图时,都会将整张图片加载到内存中。假设不去监禁,那就会一直占用着。   三,渲染内存。 不要认为,合计内存时,只算计加载到缓存中的内存便可以了。以一张1024*1024的图片为例。 CCSprite *pSprite = CCSprite::spriteWithFile("a.png");   挪用上边这行代码之后,可以在LEAKS东西中看到,增多了大概4M的内存。而后接着调用 addChild(pSprite);   这时,内存又增进了4M。也便是,一张图片,若是必要渲染的话,那它所占用的内存将要X2。   再看看经过plist加载的图片,例如这张大图尺寸为2048*2048。想要加载此中的一张32*32的小图片 CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("b.plist"); 此时内存增加16M (汗) CCSprite *pSpriteFrame = CCSprite::spriteWithSpriteFrameName("b1.png"); b.png 大小为32*32 ,想着也便是增进一点点内存,可实践情况是增长16M内存。也就是只有渲染了此中的一局部,那末整张图片都要一块儿被加载。  但是环境不是那末的糟糕,这些曾经渲染的图片,假定再次加载的话,内存是不会再持续抬高的,比方又添加了100个b.plist的另一个区域,图片内存照旧共增加16+16 = 32M,而不会继续上升。    四,缓存禁锢 假定游戏有不少场景,在切换场景的时刻可以把前一个场景的内存所有开释,预防总内存过高. CCTextureCache::sharedTextureCache()->removeAllTextures(); 拘留到今朝为止所有加载的图片 CCTextureCache::sharedTextureCache()->removeUnusedTextures(); 将引用计数为1的图片开释掉CCTextureCache::sharedTextureCache()->removeTexture(); 单独囚系某个图片 CCSpriteFrameCache 与 CCTextureCache 监禁的门径差不久不多。 值得留神的是扣留的机缘,多在切换场景的时刻禁锢资本,假定从A场景切换到B场景,调用的函数顺序为B::init()---->A::exit()---->B::onEnter() 。 可若是使用了切换效果,譬如CTransitionJumpZoom::transitionWithDuration这样的函数,则函数的挪用顺序酿成B::init()---->B::onEnter()---->A::exit() 。 而且第二种方式会有一刹时将两个场景的利润叠加在一起,若是不采用偏激,很可能会由于内存短促而瓦解。 无心强逼监管悉数资源时,会使某个正在履行的动画取得引用而弹出异常,可以挪用CCActionManager::sharedManager()->removeAllActions();来解决。  五,内存优化 优化的心得等于只管即便去拼接图片,使图片边长尽可能的保持2的N次方况且装的很满。但要寄望,有逻辑相干的图片只管即便打包在一张大图里,其他一点就是打包的时辰要思考到层的漫衍。由于为了渲染依顺可能会用到CCSpriteBatchNode;对立个BatchNode里的图片凡是位于一个层级的,是以必须根据各个图片的层级关系,打包到不合的plist里。偶尔内存与依顺不成以兼得,只能只管即便失调了。    六,其他 最后附一个各代IOS设施的内存制约环境 设备                                              倡议内存                   最大内存 iPad2/iPhone4s/iphone4                170-180mb                 512mb iPad/iPod touch3,4/iphone3gs          40-80mb                  256mb iPod touch1,2/iPhone3g/iPhone1         25mb                    128mb 上述提倡内存只不过一些人自己测试的事实,可用的RAM不大于最大内存的一半,如果挨次逾越最大内存的一半,则可能会挂掉。 其他在LEAKS里查抄模拟器中与真机总的内存,会有较大收支。在摹拟器中的终归与实践更接近一些。
发表评论
用户名: 匿名