zoukankan      html  css  js  c++  java
  • cocos2dx如何优化内存的应用

    原地址:http://cblog.chinadaily.com.cn/blog-942327-4327173.html

    注:自身以前也写过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里查抄模拟器中与真机总的内存,会有较大收支。在摹拟器中的终归与实践更接近一些。

  • 相关阅读:
    单例模式
    Curator Zookeeper分布式锁
    LruCache算法原理及实现
    lombok 简化java代码注解
    Oracle客户端工具出现“Cannot access NLS data files or invalid environment specified”错误的解决办法
    解决mysql Table ‘xxx’ is marked as crashed and should be repaired的问题。
    Redis 3.0 Cluster集群配置
    分布式锁的三种实现方式
    maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令
    How to Use Convolutional Neural Networks for Time Series Classification
  • 原文地址:https://www.cnblogs.com/GameDeveloper/p/2750746.html
Copyright © 2011-2022 走看看