基礎(chǔ)部分
1: 圖片內(nèi)存大小小結(jié)
a: 圖片:是占用內(nèi)存的大戶,尤其是手機(jī)游戲圖片資源眾多。對圖片資源在內(nèi)存中占用量的計(jì)算成為J2ME游戲開發(fā)者的經(jīng)常性工作,CoCoMo來解釋一下如何計(jì)算圖片在內(nèi)存中的占用量:內(nèi)存占用量=寬*高*像素字節(jié)數(shù),其中像素字節(jié)數(shù)因機(jī)型而異。
例如一張64*64的圖片在7210上的內(nèi)存占用量=64*64*1.5=6144(字節(jié))=6K、在S60上的內(nèi)存占用量=64*64
b:Xcode中使用instruments 查看圖片內(nèi)存的問題
如果使用的是模擬器那么默認(rèn)是小屏幕的,所以最大圖片是1024 *1024 * 4 = 4 M (1024 是圖片的寬高, 4表示的是圖片的存儲類型為4字節(jié)的。也就是 RGBA8888)
如果你加載了圖片那么就是使用了4M的內(nèi)存。如果你需要渲染那么還需要4M的內(nèi)存。
加載一般都是 **load (NSString *)filename ,
渲染一般都是 Node addChild (Node)
2: 引用計(jì)數(shù)問題
引用計(jì)數(shù)增加的情況 : a: alloc 對象會使得對象引用數(shù) +1
b:調(diào)用retain (具體細(xì)說一些實(shí)例如下)
->比如你是cocos2d用戶的會看到 addchild 會使子節(jié)點(diǎn)的引用計(jì)數(shù)+1
->CCArray 的addObject 也會使元素的引用計(jì)數(shù)+1
總結(jié)一下就是: 凡是添加到結(jié)合中的元素或者子節(jié)點(diǎn)不需要再去retain ,只需要在建立的時(shí)候調(diào)用release
減少的情況 : 調(diào)用release 使引用計(jì)數(shù) -1(具體細(xì)說一些實(shí)例如下)
-> 集合調(diào)用remove/removeChildByTag 等等變形的
-> 創(chuàng)建的時(shí)候調(diào)用autorelease 。注意:如果你的對象是局部對象,而且創(chuàng)建的時(shí)候使用的是autorelease,
那么在離開方法的時(shí)候如果你沒有retain 那么這個(gè)對象將被dealloc(引用計(jì)數(shù)-1了)
官網(wǎng)的介紹:
•
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與圖片內(nèi)存
在IOS上,圖片會被自動縮放到2的N次方大小。比如一張1024*1025的圖片,占用的內(nèi)存與一張1024*2048的圖片是一致的。圖片占用內(nèi)存大小的計(jì)算的公式是;長*寬*4。這樣一張512*512占用的內(nèi)存就是 512*512*4 = 1M。其他尺寸以此類推。(ps:IOS上支持的最大尺寸為2048*2048)。
,cocos2d-x的圖片緩存
Cocos2d-x 在構(gòu)造一個(gè)精靈的時(shí)候會使用spriteWithFile或者spriteWithSpriteFrameName等無論用哪種方式,cocos2d-x都會將這張圖片加載到緩存中。如果是第一次加載這個(gè)圖片,那就會先將這張圖片加載到緩存,然后從緩存讀取。如果緩存中已經(jīng)存在,則直接從緩存中提取,免除了加載過程。
新聞熱點(diǎn)
疑難解答
圖片精選