cocos2d-x 優(yōu)化

一憔狞,IOS與圖片內(nèi)存
在IOS上蝴悉,圖片會被自動縮放到2的N次方大小。比如一張10241025的圖片瘾敢,占用的內(nèi)存與一張10242048的圖片是一致的拍冠。圖片占用內(nèi)存大小的計算的公式是;長4簇抵。這樣一張512512 占用的內(nèi)存就是 5125124 = 1M庆杜。其他尺寸以此類推。(ps:IOS上支持的最大尺寸為20482048)碟摆。
二晃财,cocos2d-x 的圖片緩存
Cocos2d-x 在構(gòu)造一個精靈的時候會使用spriteWithFile或者spriteWithSpriteFrameName等 無論用哪種方式,cocos2d-x都會將這張圖片加載到緩存中典蜕。如果是第一次加載這個圖片断盛,那就會先將這張圖片加載到緩存,然后從緩存讀取愉舔。如果緩存中已經(jīng)存在钢猛,則直接從緩存中提取,免除了加載過程轩缤。
圖片的緩存主要由以下兩個類來處理:CCSpriteFrameCache命迈, CCTextureCache
CCSpriteFrameCache加載的是一張拼接過的大圖贩绕,每一個小圖只是大圖中的一個區(qū)域,這些區(qū)域信息都在plist文件中保存壶愤。用的時候只需要根據(jù)小圖的名稱就可以加載到這個區(qū)域淑倾。
CCTextureCache 是普通的圖片緩存,我們所有直接加載的圖片都會默認放到這個緩存中征椒,以提高調(diào)用效率娇哆。
因此,每次加載一張圖片陕靠,或者通過plist加載一張拼接圖時,都會將整張圖片加載到內(nèi)存中脱茉。如果不去釋放剪芥,那就會一直占用著。
三琴许,渲染內(nèi)存税肪。
不要以為,計算內(nèi)存時榜田,只計算加載到緩存中的內(nèi)存就可以了益兄。以一張10241024的圖片為例。
CCSprite pSprite = CCSprite::spriteWithFile("a.png");
調(diào)用上邊這行代碼以后箭券,可以在LEAKS工具中看到净捅,增加了大約4M的內(nèi)存。然后接著調(diào)用
addChild(pSprite);
這時辩块,內(nèi)存又增加了4M蛔六。也就是,一張圖片废亭,如果需要渲染的話国章,那它所占用的內(nèi)存將要X2。
再看看通過plist加載的圖片豆村,比如這張大圖尺寸為2048
2048液兽。想要加載其中的一張32
32的小圖片
CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("b.plist");
此時內(nèi)存增加16M (汗)
CCSprite pSpriteFrame = CCSprite::spriteWithSpriteFrameName("b1.png");
b.png 大小為32
32 ,想著也就是增加一點點內(nèi)存掌动,可實際情況是增加16M內(nèi)存四啰。也就是只要渲染了其中的一部分,那么整張圖片都要一起被加載粗恢。
但是情況不是那么的糟糕拟逮,這些已經(jīng)渲染的圖片,如果再次加載的話适滓,內(nèi)存是不會再繼續(xù)升高的敦迄,比如又增加了100個b.plist的另一個區(qū)域,圖片內(nèi)存還是共增加16+16 = 32M,而不會繼續(xù)上升罚屋。
四苦囱,緩存釋放
如果游戲有很多場景,在切換場景的時候可以把前一個場景的內(nèi)存全部釋放脾猛,防止總內(nèi)存過高.
CCTextureCache::sharedTextureCache()->removeAllTextures(); 釋放到目前為止所有加載的圖片
CCTextureCache::sharedTextureCache()->removeUnusedTextures(); 將引用計數(shù)為1的圖片釋放掉CCTextureCache::sharedTextureCache()->removeTexture(); 單獨釋放某個圖片
CCSpriteFrameCache 與 CCTextureCache 釋放的方法差不多撕彤。
值得注意的是釋放的時機,一般在切換場景的時候釋放資源猛拴,如果從A場景切換到B場景羹铅,調(diào)用的函數(shù)順序為B::init()---->A::exit()---->B::onEnter() 。
可如果使用了切換效果愉昆,比如CTransitionJumpZoom::transitionWithDuration這樣的函數(shù)职员,則函數(shù)的調(diào)用順序變?yōu)锽::init()---->B::onEnter()---->A::exit() 。
而且第二種方式會有一瞬間將兩個場景的資源疊加在一起跛溉,如果不采取過度焊切,很可能會因為內(nèi)存吃緊而崩潰。
有時強制釋放全部資源時芳室,會使某個正在執(zhí)行的動畫失去引用而彈出異常专肪,可以調(diào)用CCActionManager::sharedManager()->removeAllActions();來解決。
五堪侯,內(nèi)存優(yōu)化
優(yōu)化的心得就是盡量去拼接圖片嚎尤,使圖片邊長盡可能的保持2的N次方并且裝的很滿。但要注意伍宦,有邏輯關(guān)系的圖片盡量打包在一張大圖里诺苹,另外一點就是打包的時候要考慮到層的分布。因為為了渲染效率可能會用到CCSpriteBatchNode;同一個BatchNode里的圖片都是位于一個層級的雹拄,因此必須根據(jù)各個圖片的層級關(guān)系收奔,打包到不同的plist里。有時內(nèi)存和效率不可以兼得滓玖,只能盡量平衡了坪哄。
六,其他
最后附一個各代IOS設(shè)備的內(nèi)存限制情況
設(shè)備 建議內(nèi)存 最大內(nèi)存
iPad2/iPhone4s/iphone4 170-180mb 512mb
iPad/iPod touch3,4/iphone3gs 40-80mb 256mb
iPod touch1,2/iPhone3g/iPhone1 25mb 128mb
上述建議內(nèi)存只是一些人自己測試的結(jié)果势篡,可用的RAM不大于最大內(nèi)存的一半翩肌,如果程序超過最大內(nèi)存的一半,則可能會掛掉禁悠。
另外在LEAKS里查看模擬器中和真機總的內(nèi)存念祭,會有較大出入。在模擬器中的結(jié)果與實際更接近一些碍侦。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末粱坤,一起剝皮案震驚了整個濱河市隶糕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌站玄,老刑警劉巖枚驻,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異株旷,居然都是意外死亡再登,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門晾剖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锉矢,“玉大人,你說我怎么就攤上這事齿尽」了穑” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵雕什,是天一觀的道長缠俺。 經(jīng)常有香客問我显晶,道長贷岸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任磷雇,我火速辦了婚禮偿警,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘唯笙。我一直安慰自己螟蒸,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布崩掘。 她就那樣靜靜地躺著七嫌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪苞慢。 梳的紋絲不亂的頭發(fā)上诵原,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天,我揣著相機與錄音挽放,去河邊找鬼绍赛。 笑死,一個胖子當(dāng)著我的面吹牛辑畦,可吹牛的內(nèi)容都是我干的吗蚌。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼纯出,長吁一口氣:“原來是場噩夢啊……” “哼蚯妇!你這毒婦竟也來了敷燎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤侮措,失蹤者是張志新(化名)和其女友劉穎懈叹,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體分扎,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡澄成,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了畏吓。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片墨状。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖菲饼,靈堂內(nèi)的尸體忽然破棺而出肾砂,到底是詐尸還是另有隱情,我是刑警寧澤宏悦,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布镐确,位于F島的核電站,受9級特大地震影響饼煞,放射性物質(zhì)發(fā)生泄漏源葫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一砖瞧、第九天 我趴在偏房一處隱蔽的房頂上張望息堂。 院中可真熱鬧,春花似錦块促、人聲如沸荣堰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽振坚。三九已至,卻和暖如春斋扰,著一層夾襖步出監(jiān)牢的瞬間渡八,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工褥实, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留呀狼,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓损离,卻偏偏與公主長得像哥艇,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子僻澎,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,749評論 25 707
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,130評論 30 470
  • Cocos2D手機游戲開發(fā)之優(yōu)化篇 在這個手機游戲盛行已久的年代貌踏,一款產(chǎn)品想要博得更多用戶的喜愛就要在細節(jié)上做得更...
    babybus_newapp閱讀 2,999評論 0 12
  • 寫在十個半月 很難想象十饥,他能夠具有和成人一樣的脾氣。你撓她祖乳,她就笑逗堵。你惹她不高興,她就亂哼哼眷昆。此刻蜒秤,她正站在沙發(fā)面...
    江山吳閱讀 262評論 0 4
  • 本文出自于金馬老師課程——“金馬帶你定投區(qū)塊鏈”的課程,還有“白話區(qū)塊鏈”公眾號中的概念亚斋,我的目的就是把對同一個概...
    丁昆朋閱讀 2,350評論 5 8