一憔狞,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加載的圖片豆村,比如這張大圖尺寸為20482048液兽。想要加載其中的一張3232的小圖片
CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("b.plist");
此時內(nèi)存增加16M (汗)
CCSprite pSpriteFrame = CCSprite::spriteWithSpriteFrameName("b1.png");
b.png 大小為3232 ,想著也就是增加一點點內(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é)果與實際更接近一些碍侦。
cocos2d-x 優(yōu)化
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進店門晾剖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锉矢,“玉大人,你說我怎么就攤上這事齿尽」了穑” “怎么了?”我有些...
- 文/不壞的土叔 我叫張陵雕什,是天一觀的道長缠俺。 經(jīng)常有香客問我显晶,道長贷岸,這世上最難降的妖魔是什么? 我笑而不...
- 正文 為了忘掉前任磷雇,我火速辦了婚禮偿警,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘唯笙。我一直安慰自己螟蒸,他們只是感情好,可當(dāng)我...
- 文/花漫 我一把揭開白布崩掘。 她就那樣靜靜地躺著七嫌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪苞慢。 梳的紋絲不亂的頭發(fā)上诵原,一...
- 文/蒼蘭香墨 我猛地睜開眼纯出,長吁一口氣:“原來是場噩夢啊……” “哼蚯妇!你這毒婦竟也來了敷燎?” 一聲冷哼從身側(cè)響起,我...
- 正文 年R本政府宣布镐确,位于F島的核電站,受9級特大地震影響饼煞,放射性物質(zhì)發(fā)生泄漏源葫。R本人自食惡果不足惜,卻給世界環(huán)境...
- 文/蒙蒙 一砖瞧、第九天 我趴在偏房一處隱蔽的房頂上張望息堂。 院中可真熱鬧,春花似錦块促、人聲如沸荣堰。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽振坚。三九已至,卻和暖如春斋扰,著一層夾襖步出監(jiān)牢的瞬間渡八,已是汗流浹背。 一陣腳步聲響...
推薦閱讀更多精彩內(nèi)容
- Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
- *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
- Cocos2D手機游戲開發(fā)之優(yōu)化篇 在這個手機游戲盛行已久的年代貌踏,一款產(chǎn)品想要博得更多用戶的喜愛就要在細節(jié)上做得更...
- 本文出自于金馬老師課程——“金馬帶你定投區(qū)塊鏈”的課程,還有“白話區(qū)塊鏈”公眾號中的概念亚斋,我的目的就是把對同一個概...