1

我正在构建一个 iOS 游戏,我注意到该游戏在 XCode 调试器中正常运行时运行良好。但是,当我从 Instruments(产品-> Profile 以跟踪泄漏)中运行它时,当 Instruments 在左侧边栏中显示“分析过程”时,游戏会冻结。在那之后,游戏的所有状态都混乱了,因为正在分析的游戏的某些部分冻结了,而其他部分继续进行。

这是我可以/需要解决的问题,还是足以确保游戏在发行版中运行?

如果需要修复,我需要做什么才能使其正常工作?

更新1:

所以我们发现了问题 - 即使我们正在玩游戏,同样的问题也会重现,按下主页按钮并单击游戏图标并继续玩。

问题是我们的大部分工作都是在 update 方法中完成的,它依赖于 (ccTime)dt 参数的值。dt 的值通常小于 0.1 秒,偶尔会达到 0.5 秒。当我们暂停(通过单击主页按钮,或者当仪器暂停游戏以拍摄快照时)并继续播放时,dt 的值是几个秒!这会使我们所有的计算超出范围。

我们尝试了一个临时的(但丑陋的)解决方法来解决这个问题:在更新方法的开头,我们添加了这个:

if(dt > 1)
  return;

它现在按预期工作 - 不会不同步。但是,这不是一个永久的解决方案,因为有时 dt 的值合理地接近 1 秒,并且在资源紧张的情况下,这可能会导致卡顿(或更糟)。

我们还考虑了另一种(同样丑陋的)存储先前 dt 值的解决方案,然后检查更新方法:

if(dt > 10 * prevDt)
{
  return;
}

我们尝试调用's并调用方法unscheduleUpdate,但该方法不起作用。AppDelegate.mapplicationDidEnterBackgroundscheduleUpdateapplicationWillEnterForeground

处理由于外部暂停而导致时间值不稳定的更新的最佳方法是什么?

谢谢阿南德

4

2 回答 2

2

不幸的是,这是一个没有确定答案的问题。至少不能在没有访问您的系统的情况下运行各种检查。

配置文件中的失败可能是因为您的游戏正在运行紧密的循环,其时间以不可预知的方式受到干扰,并且您的游戏由于时间或资源问题而崩溃(这些时间问题不会在同一个调试器中出现)方法)。如果是这种情况,您可能无能为力。也可能是因为你的代码有问题。问题是很难弄清楚其中哪一个是这种情况。最好假设问题出在您的代码中,然后做一些进一步的调查。

如果您还没有这样做,首先要做的是运行静态分析工具(从 Xcode 的产品菜单中分析)。仔细考虑每个提出的错误,并努力消除所有错误。有时它们可​​能看起来很明显,你认为你可以忽略它们,但一些刺激表明它们是更深层次问题的征兆。

如果您还没有尝试过,请尝试运行仪器来检查僵尸。如果分配工具失败,这也很有可能会失败,但是如果有一些对取消分配对象的过时引用挂在周围,它们可能会导致您遇到的问题。您可以尝试的另一种工具是性能分析器,用于检查您的应用程序在哪里花费了大部分时间。您不知道的资源过度分配可能存在一些非常严重的问题。如果您无法运行内存分析器,您将很难查看是否是这种情况,但使用性能分析器,可能会看到您的应用程序是否在不应该的地方挂起太久'不是。

最后——如果所有其他方法都失败了,这可能是一把敲碎坚果的大锤——而且在任何情况下也可能无法提供解决方案。如果您不使用 ARC,请考虑将您的应用程序转换为使用它需要多长时间(当然,在这样做之前先创建一个分支)。Apple 的对象分配/释放算法非常有效,如果您有细微的内存管理错误,很有可能会被自动引用计数消除。

于 2013-01-11T17:34:48.070 回答
2

我不太了解 cocos2D 的工作原理,但如果您没有选择余地,我会简单地将增量时间限制在一个上限范围内。在使用增量时间的任何更新方法中,我都会执行以下操作。

double delta = (dt > 0.5) : (0.5) ? (dt);

从那时起使用delta而不是。dt结果是任何具有超过半秒的增量的帧都将被限制为半秒的增量。您不想跳过帧,因为那样您可能会连续跳过许多帧,这对用户不利;他们可能会认为应用程序崩溃了。但是,您不想运行具有大增量的框架,因为那样依赖于增量的对象和力将在该框架中成倍增加,从而阻止您捕获碰撞和其他东西。因此,我们通过简单地向下限制值来防止游戏在不跳帧的情况下完全搞砸。

不利的是,当您的帧速率降至每秒 2 帧时,该应用程序的移动速度会显得更慢。您失去了基于时间的更新方法的好处,即当引擎负担过重时,始终使游戏看起来以明确定义的速度运行的能力。

老实说,如果你长时间以每秒 2 帧的速度运行,你就会有更大的问题需要担心。如果游戏只渲染一次,我认为用户不会注意到对象每秒移动的速度是否稍微慢一些。

于 2013-02-12T04:23:15.343 回答