【问题标题】:Cocos2D v.3 High CPU low FPS can't be normal?Cocos2D v.3 高CPU低FPS不能正常?
【发布时间】:2014-07-04 13:04:43
【问题描述】:

我几乎完成了一款游戏,但我注意到它的 FPS 低且 GPU 使用率高。我已经运行了一个跟踪来尝试查明问题,但是所有的 CPU 时间似乎都被 Cocos2D 框架占用了。这是否意味着这种行为是正常的?或者我对结果的解释是错误的?我读到使用渲染引擎时实际上不可能空闲,但是当没有动画发生时 98% 的 CPU 使用率似乎是非常错误的。任何人都可以阐明这里发生的事情吗?或者告诉我我还能发布什么来帮助别人帮助我?

【问题讨论】:

  • 在使用发布构建配置的设备上进行了测试?计划中未启用僵尸?

标签: performance cocos2d-iphone instruments spritebuilder


【解决方案1】:

您最重的堆栈有 25 层深,其中 9 层似乎在您的代码中(Mighty Meteor?)。如果堆栈上的这些函数调用中的任何一个被执行的次数超过了必要的次数,那就可以解释这个问题。让任何计算机陷入瘫痪的最简单方法是让它执行两次、三次或更多次,如果一次就足够了,尤其是在不止一个抽象级别上完成时。

添加:看起来像是在您的代码中的九个级别的调用是:

93.2% CCDirectorIOS drawScene
78.6% CCScheduler update
77.4% invokeMethods
76.3% CCActionManager update:
65.3% CCActionFollow step:
60.6% CCNode position
38.3% CCNode nodeToParentTransform
30.3% RigidBodyToParentTransform
14.0% NodeToPhysicsTransform
 5.4% objc_object::sidetable_retain()

不清楚左边的数字实际上是什么意思(可能是上面所有级别中相等的堆栈跟踪的一部分),但如果任何函数被调用 N 次并使用相同的参数,它可能是只调用一次,它将执行时间乘以 N。如果其中另一个被调用 M 次,而它可以只调用一次,则减速因子为 N*M。 而且无论是否有这样的放缓,“热门路径”看起来不会有太大不同。 因此,您无法通过查看问题所在的热路径来判断问题所在,除非说它很可能在这九个例程之一中,它调用了下面的那个。

(由于百分比是按降序排列的,它们不能是包含时间,因为包含时间必须不仅包括这些堆栈跟踪中显示的调用,还包括其他堆栈跟踪,它们只是不是“最重的”。 例如,常识告诉你应该关注从RigidBodyToParentTransform 到NodeToPhysicsTransform 的呼叫,因为左边的数字从 30.3% 下降到 14.0%。 但这并不意味着RigidBodyToParentTransform 有很多自我时间,因为没有。这只能意味着它还花费更多时间调用许多其他函数,没有一个函数的成本超过NodeToPhysicsTransform。 此外,NodeToPhysicsTransform 上的 14.0% 并不意味着该函数是相对无辜的,因为它可以在其他堆栈跟踪上调用,并且占整体包容性百分比更高。)

(另外,忽略“自身时间”。在调用其他函数的函数中,它通常是无关紧要的,此外,它包含在包含时间中。)

附:分析器是否允许您查看单个堆栈样本?反对这样做的通常论点是,你不能看足够多的东西来获得任何统计精度。 但是你不需要精度。 如果某样东西花费了 1000 个样本的 30%,那么该测量的标准偏差为 1.4%。 如果你在 10 个样本中的 3 个上看到它,它仍然是 30%,但标准差是 14%,这意味着成本大约在 16% 和 44% 之间。 如果它只有 16%,而且您可以轻松解决它,不是吗? 所以统计精度并不重要。 关键的区别是您将能够识别出在分析器摘要中不明显的加速程序的方法。 重要的是找出正在发生的事情,从时间的角度来看,这就是检查少量随机样本可以告诉你的。 那是this method。

【讨论】:

  • 感谢您提供如此详细的展望。我不得不阅读你的帖子几次才能掌握(我仍然没有完全掌握)但我磨练了你指出的那些转变。原来,我正在运行一个 runAction: [_contentNode runAction:[CCActionFollow actionWithTarget:_rocket worldBoundary:worldYBoundary]];在更新方法中。我把它转移到了 didLoadFromCCB 和瞧!感谢您花这么多时间帮助我,我很高兴!
  • @Dave440:太好了!如果你再做一次,你可能会找到更多的方法来加速它。如果是这样,您也许可以使用备用循环来增强图形的真实感。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-07
  • 1970-01-01
  • 2018-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多