2012-02-11 13 views
5

Harika bir sorunum var ve neden olduğunu çok iyi anlamıyorum. Durum böyle:Birçok sahneye sahip Cocos2D projesi belleği düzgün bir şekilde serbest bırakmıyor

  • 10 sahnede Cocos2D'de harika bir projeniz var. Her sahne, büyük sprite sahip bir kitabın bir sayfası. Kobold2D 1.0.2 uygulamasını kullanır.
  • Her sayfada, LayerColor aracılığıyla ortak menüler koymak için, bir singleton sınıfında ortak nesneler vardır.
  • sprite etrafında 16-20Mb her spritesheet yüklü PVR.CCZ RGBA4444 içinde ve iPad bellekte TexturePacker olduğunu.
  • Birinden diğerine replaceScene için CCTransitionTurnPage kullanıyorum.
  • Her sayfanın (sınıf) init yönteminde, doku ve FrameFile'ı yükleyin.
  • Her sayfanın (sınıf) onExit yönteminde, dokuları ve frameFile öğelerini kaldırın. Ben dumpCachedTextureInfo kullandım ve bana dokular yük ve bellekten tamamen boşaltın diyor.
  • Elbette, çocuklardan tüm nesneleri çıkarırım. Tüm sprite'lar, .h'deki arabirim bölümünde bildirilen ortak değişkenlerdir, çünkü onlara sınıfın her yönteminde erişmem gerekir.
  • Projem bir ARC projesinde Kobold2D entegrasyonu ile yapılır (ancak ekli Kobold2D projesi ARC uyumluluğu sorunu için etkin olmadığını biliyorum) Ben projeye başladığınızda gerçektir

, her şey mükemmel ama hafıza görünüyor her sahnede artar (sayfa) yaptım. Page1: 30Mb., Page2: 40, Sayfa 3: 54, Sayfa 4: 65 ... 7 veya 8 sahneden sonra, Cihazlar, Xcode veya iPad'in kendisi herhangi bir mesaj olmaksızın uygulamayı askıya alır (son Düşük bellek Uyarısı olan araçlar hariç) .

Neden her sahneden sonra bellek bırakmıyor? Belki de ARC ve süper dealloc değişken değil. Dokular niçin mükemmel bir şekilde boşalır gibi görünürler, ancak hiç bir şey yok gibi görünüyor, çünkü bellek çökme olmadan kontrolsüz büyüyor.

+0

Bir sahnenin dealloc yönteminde bir kesme noktası ayarlayın, eğer dealloc çağrılmazsa, bir tutma döngüsünüz varsa (ARC bunu engelleyemez, ayrıca bkz: http://stackoverflow.com/questions/3634435/can-any -on-açıklar-korumak döngüsü-ile-örneğin-codeobjective-c-ve-ne-can-biz). Özellikle CCNode * özelliklerinin hiçbirinin güçlü veya zayıf özelliklerine sahip olmadığını, atamak için ayarlanması gerektiğini kontrol edin. – LearnCocos2D

+2

Son olarak, olay yerindeki bu koruma döngüsü nedeniyle ARC'yi devre dışı bırakmalıyım. Her sahnenin gerçek bir yedeğini yapmak için herhangi bir çözüm bulamıyorum ve ARC'yi devre dışı bırakmalıyım. Bunu yaptığımda her şey iyi gider. RemoveAllTextures şimdi hafızayı dondurur (ARC ile değil) ve süper dealloc mükemmel çalışır. ARC'yi etkinleştirdiğimde dealloc'un ateş etmemesi ve ben de dokuları boşaltmak ve hafızayı dondurmak için Exit'i kullandım ama işe yaramadı. Yardımın için çok teşekkürler! –

+2

Muhtemelen ARC'yi devre dışı bırakmak yalnızca kod hatalarının davranış şeklini değiştirdi, özellikle de dairesel bir referans ARC'niz varsa veya hiçbir ARC'nin hiçbir fark yaratmaması gerekiyorsa. Artık nesneleri sessizce sızdırıyor olabilirsiniz. – LearnCocos2D

cevap

10

Bellek tutma ile benzer bir sorun yaşıyordum ve enstrümanlarda herhangi bir sızıntı görülmüyor.

-(void) onExit { 
    //unschedule selectors to get dealloc to fire off 
    [self unscheduleAllSelectors]; 
    //remove all textures to free up additional memory. Textures get retained even if the sprite gets released and it doesn't show as a leak. This was my big memory saver 
    [[CCTextureCache sharedTextureCache] removeAllTextures]; 
    [super onExit]; 
} 

bu uyguladıktan sonra, hafızam her replaceScene sonra serbest bırakıldı: denirdi her sahnenin .m dosyasına aşağıdaki yazdığım kadar (boşluk) dealloc bile etmelerini sağlamak - Ben alamadım. Umarım bu senin için biraz kullanışlıdır. çalışma ay sonra

+2

Her zaman kullanıyorum [[CCTextureCache sharedTextureCache] removeUnusedTextures]; , Cocos2D'nin dokumanın gerçekten kullanılmadığını ve dolayısıyla kaldırdığını düşünür. Bunu güvenilir bir şekilde belirleyemediğine karar verir, bu nedenle, daha yavaş olsa da, removeAllTextures bellek sorunlarını önlemek için daha iyidir. – axello

3

, ben Cocos2d en önemli ders öğrendim. CCNode nesnesini bir CCArray veya NSArray veya NSDictionary'a yerleştirdiğinizde, bu sayıyı artırır ... Bu, nesnelerin CCLayer veya CCScene dealloc'tan önce bu nesnelerden serbest bırakılması gerektiği anlamına gelir.

Sen bir [dizi removeAllObjects] veya [sözlük salıverilmesini] koymalıdır - (boşluk) temizleme ve tüm nesneleri kaldırılmış olma, daha sonra [süper temizleme] koymak; Eğer örneğinden tüm zamanlayıcı kaldırmalısınız OnExit (boşluk) - on Bu arada

. Sadece bir programcının kendisi değil. Herhangi bir CCNode üzerindeAllActions durmayı unutmayın. Ancak, dikkatli bir şekilde, CCNod'lardan (Sprite veya bir şeyden) gelen eylemlerin durdurulması, herhangi bir removeAllObjects'den önce temizlenmelidir.

Ve unutmayın: CCLayer veya CCScene düzgün kaldırmaması halinde, SimpleAudioEngine çok ses yayınlayacak değil.

+0

Bu formül hem ARC hem de ARC olmayan projeler içindir. :) –

İlgili konular