memory - 场景多的 Cocos2D 项目没有正确释放内存

标签 memory cocos2d-iphone automatic-ref-counting kobold2d

我有一个很大的问题,我不太明白为什么会发生。情况是这样的:

  • 在 Cocos2D 中有一个很棒的项目,有 10 个场景。每个场景都是一本书的一页,上面有巨大的 Sprite 。它使用 Kobold2D 1.0.2 实现。
  • 每个页面都有一个单例类中的公共(public)对象,通过 LayerColor 放置一个公共(public)菜单。
  • Sprite 是 PVR.CCZ RGBA4444 和 iPad 内存中的 TexturePacker
    每个加载的 spritesheet 大约 16-20Mb。
  • 我将 CCTransitionTurnPage 用于 replaceScene 一个到下一个。
  • 在每个页面(类)的init方法中,加载纹理和FrameFile。
  • 在每个页面(类)的 onExit 方法中,卸载纹理和 frameFile。我使用了 dumpCachedTextureInfo 并说我可以完美地从内存中加载和卸载纹理。
  • 当然,我从 child 中删除所有对象。我所有的 Sprite 都是在.h 的接口(interface)部分声明的公共(public)变量,因为我需要在类的每个方法中访问它们。
  • 我的项目是在 ARC 项目中使用 Kobold2D 集成制作的(但您知道附加的 Kobold2D 项目由于兼容性问题而未启用 ARC)

  • 事实是当我开始这个项目时,一切看起来都很完美,但我制作的每个场景(页面)的内存都在增加。 Page1: 30Mb., Page2: 40, Page 3: 54, Page 4: 65... 在 7 或 8 个场景之后,Instruments、Xcode 或 iPad 本身挂起应用程序而没有任何消息(除了具有最终低内存警告的 Instruments) .

    为什么每个场景后没有释放内存?也许是因为 ARC 和没有 super dealloc 变量。为什么纹理看起来完美卸载但似乎没有卸载,因为内存在没有控制的情况下增长直到崩溃?

    最佳答案

    我在内存保留方面遇到了类似的问题,并且仪器中没有出现泄漏。在我将以下内容写入每个场景的 .m 文件之前,我什至无法调用 -(void) dealloc:

    -(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];
    }
    

    在实现这个之后,我的内存在每次调用 replaceScene: 后被释放。希望这对你有一些用处。

    关于memory - 场景多的 Cocos2D 项目没有正确释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9237347/

    相关文章:

    memory - 在多处理器系统中,每个核心外部的内存在概念上总是平坦/统一/同步吗?

    Java 人体工程学 : how are defaults calculated?

    c - 在C中初始化数据结构来管理内存池

    objective-c - 防止 ARC 在分配后立即将弱 ivar 归零(在发布版本中)

    ios - @property definitions with ARC : strong is the default value, 但基本类型的默认值是多少?

    java - VisualVM 和 YourKit 报告同一对象的不同保留大小

    ios - Cocos3D无法二次显示场景

    iphone - [[CCTextureCache sharedTextureCache]textureForKey :@”myImageName”]; return nil

    iphone - 如何从COCOS3D中的URL加载.pod文件

    ios - ARC 中过度保留的调试策略?