cocos2d-x情境切換時記憶體過高導致crash 解決方案

來源:互聯網
上載者:User

最近在做一個cocos2d-x的項目時,遇到一個問題,就是在pc上運行都是ok的,可是在ipad和andriod上面,在情境切換時時常會掛掉,用蘋果內建的Instruments工具檢測時,發現在情境正常運行時,記憶體大概保持在三四十兆,但是在情境切換時,一瞬間會達到七八十兆,遇到一些素材比較多或者層比較多的情境,則會達到一百多兆。大家知道在ipad1上面,記憶體最大是128M,那麼這個程式如果在ipad1上面運行,肯定會經常掛掉。遇到問題,只能一步步分析,一步步找。

(1)先把所有情境的retain的東西檢查一遍,看看在Onexit的時候有沒有release掉,這個檢查完以後,還是會crash,所以這種情況不是根源。

(2)對於有好幾個層的情境,在init的時候,先載入第一個層的,而不是把所有層的東西全部載入完,在切換層的時候再載入相對應的層,這種方法果然有效,當切換到這個情境的時候,記憶體果然減少了一半左右。但是對於只有一個層的情境來說,在切換時也是會掛,所以問題還沒有找完全。

(3)我們知道,在每個情境裡面會有一個init函數,一個onEnterTransitionDidFinish函數,一個Onexit函數,init實現一些初始化工作,onEnterTransitionDidFinish在init之後執行,Onexit在情境退出時回收init時分配的資源。在調試時發現一個很有趣的現象,那就是從情境一切換到情境二時,在切換的一瞬間會記憶體會非常高,但是過了一段時間後,記憶體會回到一個平穩的狀態,譬如切換時記憶體會達到80M,切換過後記憶體會降到50M。分析原因,懷疑是上一個情境的記憶體還沒有釋放,然後這一個情境的記憶體已經分配,所以兩個疊加在一起,就比較高了。所以我便在第一個情境的Onexit函數中加一個斷點,在第二個情境的init和onEnterTransitionDidFinish函數中各加一個斷點,然後運行程式,發現程式先到第二個情境的init中,然後再回到第一個情境的Onexit中,最後才到第二個情境的onEnterTransitionDidFinish中。我才恍然大悟,原來在情境切換時,不是馬上會執行第一個情境的Onexit函數,而是先到第二個情境的init中載入資源,然後回到第一個情境中釋放資源,最後才是到onEnterTransitionDidFinish中。

最終解決方案:

把一些資源的初始化放到onEnterTransitionDidFinish中進行,那麼究竟應該把那些資源放到onEnterTransitionDidFinish中初始化,而那些資源又只能放到init中呢?

(1)像背景圖這種只能放到init中,像情境切換時要看到的一些精靈,必須放到init中,不然情境切換時會看不到背景或者一些精靈。

(2)象精靈的一些動畫,動作,可以放到onEnterTransitionDidFinish中來初始化。

舉個例子:

譬如一隻船在划動,那麼船這隻精靈在情境切換時要展示,所以必須放在init中

//小船精靈的載入

m_boatAction = CCSprite::spriteWithFile(s1_little_boat1);addChild(m_boatAction);m_boatAction->setPosition( CCPointMake(s.width/2, s.height/2+130));m_boatAction->setScale(0.3);m_boatAction->retain();

 

而船划動的動作,就可以放到onEnterTransitionDidFinish來初始化和執行

CCSize s = CCDirector::sharedDirector()->getWinSize();CCAnimation* animation = CCAnimation::animation();char frameName[100] = {0};for( int i=1;i<=5;i++){sprintf(frameName, "scene1/little_boat%d.png", i);animation->addFrameWithFileName(frameName);}CCActionInterval*  action = CCAnimate::actionWithDuration(2, animation, false);repeatAction = CCRepeatForever::actionWithAction(action);repeatAction->retain();
通過這三步,基本上就可以避免在情境切換時記憶體過而導致crash的情況

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.