亚洲免费不卡_在线视频精品_国产尤物精品_久久久久网址_久久精品91_欧美va天堂在线_狠狠入ady亚洲精品_亚洲午夜精品福利_国产精品草草_午夜精品久久99蜜桃的功能介绍

IOS 內存優化和調試技巧
來源:易賢網 閱讀:1520 次 日期:2014-11-04 11:39:33
溫馨提示:易賢網小編為您整理了“IOS 內存優化和調試技巧”,方便廣大網友查閱!

基礎部分

1: 圖片內存大小小結

a: 圖片:是占用內存的大戶,尤其是手機游戲圖片資源眾多。對圖片資源在內存中占用量的計算成為J2ME游戲開發者的經常性工作,CoCoMo來解釋一下如何計算圖片在內存中的占用量:內存占用量=寬*高*像素字節數,其中像素字節數因機型而異。

例如一張64*64的圖片在7210上的內存占用量=64*64*1.5=6144(字節)=6K、在S60上的內存占用量=64*64*2=8192 (字節)=8K。像素字節數因機型而異,例如 7210是4096色機型,也就是說用12位來表示一個像素,所以乘上1.5,而S60是65536色的機型,用16位來表示一個像素,所以乘上2。

b:Xcode中使用instruments 查看圖片內存的問題

如果使用的是模擬器那么默認是小屏幕的,所以最大圖片是1024 *1024 * 4 = 4 M (1024 是圖片的寬高, 4表示的是圖片的存儲類型為4字節的。也就是 RGBA8888)

如果你加載了圖片那么就是使用了4M的內存。如果你需要渲染那么還需要4M的內存。

加載一般都是 **load (NSString *)filename ,

渲染一般都是 Node addChild (Node)

2: 引用計數問題

引用計數增加的情況 : a: alloc 對象會使得對象引用數 +1

b:調用retain (具體細說一些實例如下)

->比如你是cocos2d用戶的會看到 addchild 會使子節點的引用計數+1

->CCArray 的addObject 也會使元素的引用計數+1

總結一下就是: 凡是添加到結合中的元素或者子節點不需要再去retain ,只需要在建立的時候調用release

減少的情況 : 調用release 使引用計數 -1(具體細說一些實例如下)

-> 集合調用remove/removeChildByTag 等等變形的

-> 創建的時候調用autorelease 。注意:如果你的對象是局部對象,而且創建的時候使用的是autorelease,

那么在離開方法的時候如果你沒有retain 那么這個對象將被dealloc(引用計數-1了)

官網的介紹:

You own any object you create by allocating memory for it or copying it.

Related methods:alloc,allocWithZone:,copy,copyWithZone:,mutableCopy,mutableCopyWithZone:

If you are not the creator of an object, but want to ensure it stays in memory for you to use, you can express an ownership interest in it.

Related method:retain

If you own an object, either by creating it or expressing an ownership interest, you are responsible for releasing it when you no longer need it.

Related methods:release,autorelease

Conversely, if you are not the creator of an object and have not expressed an ownership interest, you mustnotrelease it.

3 :參考文檔

一,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里查看模擬器中和真機總的內存,會有較大出入。在模擬器中的結果與實際更接近一些。

七, 泄漏的情況

我所碰到的主要內存泄露的方式:

1、最常見的就是,申請了引用,然后最后忘記釋放。具體么就是,使用OC的 alloc, retain, copy, new, C的malloc, realloc, C++的new等,然后沒有對應的release, free, delete。這是單向泄露。

2、retain cycle,對于OC這種使用計數的方式,可能會存在retain cycle。兩個條件,一、就是A中retain了B,B又retain了A,各自給對方計數增加,這個環可以變為很多層,就是A->B, B->C, C->D, .... Z->A,當然假如中間層越多,檢測難度就越大。二、計數減少的操作是在dealloc中,而dealloc被調用則需要計數為0。 這兩個條件相加,導致計數鎖定,內存泄露。

實戰演練

如何查找內存泄漏 ?

一:對工具的使用來查找

1、首先使用分析編譯,Analyze build,查看歸類當中的memory警告。

這個一般能發現局部變量中忘記release,或者被中途打斷release的。

2、然后就是直接使用Instruments中的leak監測。

申請了內存,然后已經沒有指向這塊內存的指針存在,可以認為是leak了。這個檢測一般是檢測這個狀態。

3、通過Instruments中allocation的mark heap。

進行不斷的重復操作,在每次場景結束后,標記內存。假如操作場景沒有泄露,內存增加應該是0。這個檢測是檢測標記點之間有哪些對象增加。另外,需要多mark幾次才會準確,不要mark兩次看到有內存增加就去找問題。

Instruments中都是可以看到其中存在什么對象,調用歷史,調用堆棧。這時候大致確定在那個類當中的那個對象泄露了。

二 ,重載法。

雖然知道了哪個類泄露了,但是有時候并不知道具體是那邊的計數出現問題。我自己的方法是,假如是自己編寫的類,那就重載retain和release方法,然后加斷點。以此來監測是什么地方retain了這個對象,卻沒有對應釋放。

如何修改內存泄漏呢 ?

1、缺啥補啥。缺release的,就補release,缺free的就加個free。

2、合理使用autorelease。對于返回給上層使用的;或者alloc對象到release中間有return等打斷操作的。建議使用autorelease。

3、合理使用assign。retain cycle,本質就是多余的雙向retain。打個比方就是應該確定哪個對象是根,哪一個是枝葉,枝葉不用去管理根,只需要知道根在那邊就可以了。所以把那些純粹是定位用的變量,屬性都改成assign方式,例如delegate。

PS:

假如對于Instruments的使用不是很清楚,可以看這個視頻

游戲中我遇到的一個非常難查的泄漏這里貢獻出來 :

對于cocos2d的用戶如果使用了CCMenu ,而且也重寫了CCScene中的onExsit 函數來檢測離開場景的時候的一些變化。但是忘了去調用super onExsit

這時候CCMenu自己注冊了一個事件delegate 就無法釋放導致CCMenu一直無法釋放。當加載到了其他場景的時候事件總會不對。就是因為這個導致的

解決辦法自然是調用super onExsit 。因為在這里他釋放了delegate

更多信息請查看IT技術專欄

更多信息請查看技術文章
易賢網手機網站地址:IOS 內存優化和調試技巧
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點

版權所有:易賢網

亚洲免费不卡_在线视频精品_国产尤物精品_久久久久网址_久久精品91_欧美va天堂在线_狠狠入ady亚洲精品_亚洲午夜精品福利_国产精品草草_午夜精品久久99蜜桃的功能介绍
国产精品一区二区欧美| 国产精品夜夜夜一区二区三区尤| 欧美性天天影院| 在线 亚洲欧美在线综合一区| 亚洲国产日韩欧美一区二区三区| 国产精品久久久久久久久久妞妞 | 老**午夜毛片一区二区三区| 午夜天堂精品久久久久| 中文久久精品| 亚洲五月婷婷| 欧美尤物一区| 国产精品日本| 伊人蜜桃色噜噜激情综合| 性刺激综合网| 99亚洲视频| 伊人久久大香线蕉av超碰演员| 亚洲一区二区三区免费观看| 在线日韩av永久免费观看| 久久高清国产| 一本久道久久综合狠狠爱| 欧美日韩一区二区视频在线观看 | 欧美99在线视频观看| 在线观看福利一区| 欧美国产综合| 久久亚洲午夜电影| 亚洲影视在线| 日韩亚洲视频| 在线播放不卡| 亚洲视频综合| 韩国在线一区| 亚洲先锋成人| 激情欧美一区| 激情久久综合| 亚洲高清免费| 极品日韩av| 国产精品vip| 国产一在线精品一区在线观看| 玖玖玖国产精品| 久久婷婷丁香| 欧美成人日本| 欧美日韩成人| 欧美精品福利| 欧美另类女人| 国精品一区二区三区| 国产精品v亚洲精品v日韩精品| 欧美激情性爽国产精品17p| 免费久久99精品国产自在现线| 国产精品资源| 久久精品一本| 国产精品xvideos88| 韩日午夜在线资源一区二区| 黄色av成人| 亚洲欧洲一区二区在线观看| 99av国产精品欲麻豆| 国产视频一区在线观看一区免费| 国产精品毛片| 欧美.日韩.国产.一区.二区| 国产在线精品二区| 一本色道久久综合亚洲精品婷婷 | 99精品国产在热久久婷婷| 亚洲精品在线视频观看| 99国产精品久久久久久久成人热 | 久久99伊人| 午夜精品久久99蜜桃的功能介绍| 欧美日韩一区二区视频在线观看| 好吊日精品视频| 一本一本久久| 午夜亚洲福利| 亚洲视频播放| 欧美日韩三级电影在线| 国产日韩1区| 欧美日韩亚洲一区三区| 国产一区二区三区免费不卡| 欧美激情第二页| 亚洲视频播放| 国产精品红桃| 久久精品一区二区三区中文字幕| 欧美日韩视频| 午夜一区二区三区不卡视频| 亚洲先锋成人| 欧美大香线蕉线伊人久久国产精品| 国产精品久久7| 性感少妇一区| 99精品视频免费观看视频| 欧美国产先锋| 亚洲欧美日韩另类精品一区二区三区| 欧美人成网站| 亚洲综合二区| 一区二区三区四区国产| 欧美久久久久久久| 美女精品在线| 国产精品日韩欧美一区二区| 亚洲无线视频| 欧美日韩亚洲在线| 久久久久免费| 久久不射中文字幕| 国产情侣一区| 亚洲经典在线| 亚洲一二三区在线| 很黄很黄激情成人| 欧美日韩综合| 欧美日韩系列| 国产精品国码视频| 欧美精品国产一区| 欧美69wwwcom| 欧美精品黄色| 欧美精品一级| 欧美日韩免费观看一区| 午夜日韩电影| 欧美日韩国产在线一区| 午夜欧美精品久久久久久久| 牛牛国产精品| 久久亚洲风情| 欧美另类视频在线| 欧美日本中文| 国内激情久久| 亚洲国产精品日韩| 99精品国产一区二区青青牛奶| 影院欧美亚洲| 亚洲免费播放| 亚洲一区国产| 久久亚洲国产精品一区二区| 欧美成人免费在线| 亚洲视频福利| 中文一区在线| 久久综合一区二区三区| 欧美凹凸一区二区三区视频| 欧美日韩国产综合在线| 亚洲一二三区在线| 中文精品一区二区三区| 性欧美videos另类喷潮| 欧美大片专区| 亚洲精品人人| 老妇喷水一区二区三区| 国产自产精品| 亚洲美女毛片| 久久精品国产99精品国产亚洲性色| 久久精品女人| 伊人精品成人久久综合软件| 国产精品免费看| 午夜精品美女久久久久av福利| 午夜免费电影一区在线观看| 亚洲二区三区四区| 性欧美videos另类喷潮| 国产精品多人| 亚洲一区尤物| 欧美日韩一区二区三区在线观看免| 亚洲一二三区在线| 免费日韩av片| 亚洲黄色一区| 欧美成人tv| 一本久道综合久久精品| 女人色偷偷aa久久天堂 | 亚洲一区欧美二区| 午夜精品久久| 国产亚洲一区在线| 韩日成人av| 久久一本综合频道| 一本久道综合久久精品| 国产一区亚洲| 女人香蕉久久**毛片精品| 99热免费精品| 欧美日韩一区综合| 久久久久中文| 国产婷婷精品| 99热免费精品在线观看| 激情欧美亚洲| 欧美三区视频| 欧美日本亚洲| 欧美成人有码| 欧美88av| 欧美在线日韩精品| 久久综合一区| 久久国产精品亚洲77777| 国产欧美日本| 亚洲日韩成人| 影音欧美亚洲| 亚洲午夜精品久久久久久浪潮| 欧美jizzhd精品欧美巨大免费| 亚洲一区在线直播| 国产伦精品一区二区三区照片91 | 国产精品日本一区二区| 亚洲激情一区二区三区| 国模一区二区三区| 国产精品va| 国产在线欧美| 精品成人一区| 亚洲欧洲日本一区二区三区| 亚洲午夜在线观看| 精品不卡视频| 国产欧美日韩亚洲| 香蕉国产精品偷在线观看不卡| 国产日韩一区欧美| 羞羞视频在线观看欧美| 久久不射2019中文字幕| 久久久99国产精品免费| 久久激情中文| 欧美日韩亚洲三区| 尤物在线精品| 国产精品最新自拍| 欧美va天堂在线| 伊人成人在线视频| 国产精品一区二区你懂得| 麻豆久久久9性大片| 欧美日本中文| 夜夜嗨av一区二区三区网站四季av| 中文欧美日韩| 牛牛国产精品| 亚洲成色最大综合在线| 亚洲一区日韩在线| 欧美日韩国产高清| 精品福利电影| 免费永久网站黄欧美| 欧美成熟视频| 亚洲美女毛片| 午夜日韩福利| 国产欧美另类| 欧美三级在线| 亚洲欧美日韩国产一区二区| 欧美日韩视频一区二区三区| 99国产精品久久久久久久成人热| 免费看的黄色欧美网站| 国产综合自拍| 美女亚洲精品| 亚洲图片在线观看| 久久国产66| 亚洲激情一区| 欧美日韩三级电影在线| 亚洲少妇自拍| 激情欧美丁香| 欧美激情一区| 小嫩嫩精品导航| 91久久黄色| 国产精品大全| 欧美 日韩 国产精品免费观看| 99在线精品免费视频九九视| 欧美日韩在线一二三| 亚洲综合欧美日韩| 99精品免费| 精品999在线观看| 欧美高清一区| 久久精品亚洲| 免费不卡亚洲欧美| av不卡在线| 亚洲国产一区二区精品专区| 欧美视频在线观看| 欧美激情视频一区二区三区在线播放| 亚洲欧美日韩国产一区| 一区二区三区成人精品| 最新日韩欧美| 亚洲欧洲午夜| 亚洲精品日本| 一本色道久久综合亚洲精品高清| 在线精品一区二区| 亚洲福利国产| 亚洲看片一区| 日韩亚洲视频| 国产欧美午夜| 亚洲一区二区三区高清| 国产精品久久久久毛片大屁完整版| 亚洲激情视频| 一区二区三区四区五区精品视频| 亚洲精品美女91| 亚洲视频导航| 奶水喷射视频一区| 欧美成人久久| 亚洲一本视频| 一区二区精品| 翔田千里一区二区| 欧美黄色大片网站| 国产精品分类| 亚洲另类自拍| 亚洲一区日本| 欧美一区二区三区四区夜夜大片| 欧美成人精品| 亚洲国产日本| 亚洲欧美日韩综合一区| 久久婷婷亚洲| 亚洲视频中文| 国产偷国产偷亚洲高清97cao| 性欧美xxxx大乳国产app| 欧美jjzz| 亚洲精选成人| 久久一综合视频| 国内一区二区三区| 亚洲视频1区| 久久久久.com| 亚洲黄色三级| 久久综合九色99| 91久久精品www人人做人人爽| 国产亚洲二区| 国精品一区二区| 午夜亚洲伦理| 在线观看日韩av电影| 国产乱码精品| 伊人久久大香线蕉综合热线 | 另类国产ts人妖高潮视频| 欧美暴力喷水在线| 中日韩在线视频| 欧美色综合网| 久久av一区二区三区| 影音先锋亚洲电影| 玖玖在线精品| 亚洲一区二区三区精品视频| 国产精品分类| 久久国产精品久久精品国产| 欧美系列一区| 久久精品亚洲| 国产精品美女| 亚洲国产日韩美| 午夜精品亚洲| 久久黄色影院| 国产伦精品一区二区三区| 在线播放豆国产99亚洲| 午夜精品视频| 久久一日本道色综合久久| 国产精品区免费视频| 亚洲黄色大片| 一区二区三区我不卡| 欧美精品18| 久久亚洲美女| 久久精品30| 美女精品在线| 男人的天堂亚洲在线| 国产亚洲午夜| 国产欧美另类| 国产精品一二| 国产精品美女xx| 在线亚洲自拍| 在线天堂一区av电影| 日韩一级在线| 一区二区黄色| 国产一区二区高清| 国产精品日韩二区| 国产精品一国产精品k频道56| 一本久久综合| 国产精品一区在线播放| 国产区二精品视| 国产乱人伦精品一区二区| 一本色道久久综合亚洲精品高清 | 欧美日韩国产高清视频| 久久综合中文| 你懂的国产精品| 欧美精品午夜| 亚洲香蕉网站| 亚洲美女啪啪| 亚洲中字黄色| 老司机精品视频网站| 欧美在线视频二区| 欧美区日韩区| 欧美日韩国产在线一区| 国产综合自拍| 99精品国产在热久久下载| 国产欧美丝祙| 美脚丝袜一区二区三区在线观看| 美女黄网久久| 欧美涩涩视频| 在线视频日韩| 玖玖精品视频| 136国产福利精品导航网址| 国产日韩一区二区三区在线| 免费亚洲一区二区| 韩国自拍一区| 亚洲欧美日韩国产综合精品二区| 久久深夜福利| 亚洲国产精品毛片| 久久xxxx精品视频| 黄色欧美日韩| 亚洲欧美不卡| 国产主播一区二区三区四区| 国产私拍一区| 欧美日韩爆操| 9色精品在线| 欧美喷水视频| 亚洲一区二区精品在线| 国内在线观看一区二区三区| 国产亚洲精品v| 欧美涩涩视频| 国产精品久久国产愉拍| 欧美三级视频| 久久国产精品久久w女人spa| 精品1区2区3区4区| 久久综合一区| 一区二区欧美日韩| 欧美久久久久久| 亚洲制服av| 一区二区三区av| 亚洲午夜精品一区二区| 老牛国产精品一区的观看方式| 在线亚洲成人| 亚洲精选91| 在线精品在线| 好吊日精品视频| 欧美 日韩 国产一区二区在线视频| 亚洲精品资源| 亚洲国内在线| 国产综合网站| 欧美日韩一区二区三区免费| 久久精品国产综合精品| 中文欧美日韩|