溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Cocos2dx介紹優(yōu)化內(nèi)存的應用

發(fā)布時間:2020-07-21 08:55:24 來源:網(wǎng)絡 閱讀:400 作者:藍鷗劉輝 欄目:移動開發(fā)

藍鷗iOS培訓講師推薦:最火的一款引擎Cocos2dx,但是有關它的培訓,目前還有很少的機構(gòu)做這方面,如果你想了解更多的內(nèi)容,可以去網(wǎng)上多搜一些這方面的知識,看看誰可以幫助到你。

和大家簡單的說一下有關如何優(yōu)化內(nèi)存的應用的問題,有可能有出入!

一、iOS與圖片內(nèi)存 

在iOS上,圖片會被積極縮放到2的N次方大小。如一張1024*1025的圖片,占用的內(nèi)存與一張1024*2048的圖片是一樣的。圖片占用內(nèi)存大小的共計的公式是;長*寬*4。何等一張512*512 占用的內(nèi)存即是 512*512*4 = 1M。其他尺寸以此類推。 

二、Cocos2d-x 的圖片緩存 

Cocos2d-x 在機關一個精靈的時辰會運用spriteWithFile或者spriteWithSpriteFrameName等 豈論用哪類方式,cocos2d-x都會將這張圖片加載到緩存中。若是是第一次加載這個圖片,那就會先將這張圖片加載到緩存,往后從緩存讀取。假如緩存中已經(jīng)存在,則直接從緩存中提取,免去了加載進程。 

圖片的緩存主要由下列兩個類來措置:CCSpriteFrameCache, CCTextureCache 

CCSpriteFrameCache加載的是一張拼接過的大圖,每個小圖只不過大圖中的一個地域,這些地域信息都在plist文件中生存。用的時辰只重要根據(jù)小圖的稱號便可以加載到這個區(qū)域。 

CCTextureCache 是尋常的圖片緩存,我們所有直接加載的圖片都會默許放到這個緩存中,以行進挪用聽從。

因而,每次加載一張圖片,或者顛末plist加載一張拼接圖時,都會將整張圖片加載到內(nèi)存中。假設不去監(jiān)禁,那就會一直占用著。 

三、渲染內(nèi)存

不要認為,合計內(nèi)存時,只算計加載到緩存中的內(nèi)存便可以了。以一張1024*1024的圖片為例。

CCSprite *pSprite = CCSprite::spriteWithFile("a.png"); 

挪用上邊這行代碼之后,可以在LEAKS東西中看到,增多了大概4M的內(nèi)存。而后接著調(diào)用addChild(pSprite); 這時,內(nèi)存又增進了4M。也便是,一張圖片,若是必要渲染的話,那它所占用的內(nèi)存將要X2。 

再看看經(jīng)過plist加載的圖片,例如這張大圖尺寸為2048*2048。想要加載此中的一張32*32的小圖片

CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("b.plist");

此時內(nèi)存增加16MCCSprite *pSpriteFrame = CCSprite::spriteWithSpriteFrameName("b1.png");

b.png 大小為32*32 ,想著也便是增進一點點內(nèi)存,可實踐情況是增長16M內(nèi)存。也就是只有渲染了此中的一局部,那末整張圖片都要一塊兒被加載。 

但是環(huán)境不是那末的糟糕,這些曾經(jīng)渲染的圖片,假定再次加載的話,內(nèi)存是不會再持續(xù)抬高的,比方又添加了100個b.plist的另一個區(qū)域,圖片內(nèi)存照舊共增加16+16 = 32M,而不會繼續(xù)上升。 

四、內(nèi)存優(yōu)化 

優(yōu)化的心得等于只管即便去拼接圖片,使圖片邊長盡可能的保持2的N次方?jīng)r且裝的很滿。但要寄望,有邏輯相干的圖片只管即便打包在一張大圖里,其他一點就是打包的時辰要思考到層的漫衍。由于為了渲染依順可能會用到CCSpriteBatchNode;對立個BatchNode里的圖片凡是位于一個層級的,是以必須根據(jù)各個圖片的層級關系,打包到不合的plist里。偶爾內(nèi)存與依順不成以兼得,只能只管即便失調(diào)了。

五、緩存禁錮 

假定游戲有不少場景,在切換場景的時刻可以把前一個場景的內(nèi)存所有開釋,預防總內(nèi)存過高.

CCTextureCache::sharedTextureCache()->removeAllTextures(); 拘留到今朝為止所有加載的圖片

CCTextureCache::sharedTextureCache()->removeUnusedTextures(); 將引用計數(shù)為1的圖片開釋掉

CCTextureCache::sharedTextureCache()->removeTexture(); 單獨囚系某個圖片

CCSpriteFrameCache 與 CCTextureCache 監(jiān)禁的門徑差不久不多。

值得留神的是扣留的機緣,多在切換場景的時刻禁錮資本,假定從A場景切換到B場景,調(diào)用的函數(shù)順序為B::init()---->A::exit()---->B::onEnter() 。

可若是使用了切換效果,譬如CTransitionJumpZoom::transitionWithDuration這樣的函數(shù),則函數(shù)的挪用順序釀成B::init()---->B::onEnter()---->A::exit() 。

而且第二種方式會有一剎時將兩個場景的利潤疊加在一起,若是不采用偏激,很可能會由于內(nèi)存短促而瓦解。

無心強逼監(jiān)管悉數(shù)資源時,會使某個正在履行的動畫取得引用而彈出異常,可以挪用

CCActionManager::sharedManager()->removeAllActions();來解決。  

目前想到的也就這么多,如果有其它的內(nèi)容,想到的話,我會隨時補上來,向大家說明,現(xiàn)在也就這么多!希望能夠?qū)Υ蠹矣袔椭?,有問題的話,隨時溝通!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI