【问题标题】:Cocos2d FPS drops when ReplacingScene but Scene is not retained and its with ARCCocos2d FPS 在 ReplacingScene 但未保留场景且与 ARC 时下降
【发布时间】:2013-07-19 19:55:45
【问题描述】:

我有一个 MainMenuScene 和一个 GameScene...

在 MainMenu 中,我有进入 GameScene 的按钮开始,在游戏中间我想重新启动或退出游戏,无论我做什么,当我用另一个 GameScene 替换 GameScene 时或者只是回到主菜单然后再次回到新的GameScene,FPS开始下降,如果我这样做循环1次FPS从60下降到30,如果我再次这样做,FPS下降到15,等等等等……

我认为问题是内存泄漏,因为我让场景活着......但我没有检查并检查过,并且在任何地方都没有对该场景的强引用,并且它启用了 ARC,我检查了根据 Xcode 的仪器,仪器配置文件没有任何内存泄漏。

有没有人遇到过这个问题...或者任何人知道我做错了什么?根据我在 CCDirector 的 ReplaceScene 方法中读到的内容,场景被破坏并替换为新场景,所以应该没有问题。

== 忘了说: 我在单例中对 GameLayer 和 GameScene 有一个弱引用,但是当我替换场景时,我立即将那些 2 设置为 nil,尽管我不应该这样做,因为它们是弱引用,但我这样做是为了以防万一。

添加图片以获得更多上下文:

通过上图,您可以看到每次调用 CCDirector 的 ReplaceScene 时,场景,特别是 GameScenes,都会被释放。所以内存泄漏不是问题,但似乎场景没有被破坏,或者这就是我的想法,因为 FPS 每次都在不断下降。

...稍后更换场景很少...

这里奇怪的是 MainMenu 根本没有受到影响,渲染时间是一样的......绘图调用是一样的(这是可以理解的,即使在 GameScene 中绘图调用保持不变。)但是在 GameScene 中,FPS 不断下降,渲染时间变得非常长,这就是游戏变得异常缓慢的原因。

会继续检查。

【问题讨论】:

  • 场景的dealloc方法是否运行?如果没有,它正在泄漏。最常见的原因是保留循环,即一个节点持有对父节点或兄弟节点的强引用。
  • 问题是,它使用 ARC,所以它没有被调用 dealloc...当它使用 ARC 时我无法实现该方法。我检查了 Xcode Profile Instruments,没有发现内存泄漏。
  • @LearnCocos2D 我的错...我刚刚检查过它正在释放对象。我有一张图片想上传给你看断点......但如果它被解除分配,那么发生了什么?为什么我的 FPS 下降了?
  • 您在设备上进行测试吗?与发布配置?您还应该再次使用仪器检查哪些物体仍然活着,以及该数字是否会随着时间的推移而增加。如果由于强 ref(例如单例中的数组)而创建越来越多的活动对象,如果它们保持活动状态,则它们不会在 Instruments 中显示为泄漏。
  • 没关系,我解决了:)

标签: cocos2d-iphone game-development


【解决方案1】:

解决方案非常简单...除批处理节点外,所有内容都被正确释放,处理后台的特定批处理节点正在扼杀我的应用程序性能。

所以对于任何人来说,请记住在替换场景时检查您的 CCBatchNodes 和任何其他强引用是否连接到场景。释放几乎立即发生,但它有助于将被释放的父对象的子对象设置为 nil。但就我而言,SpriteBatchnode 是严重影响我的 FPS 渲染时间性能的节点。

感谢 LearnCocos2D,非常感谢您的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    相关资源
    最近更新 更多