1

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

仪器跟踪

4

1 回答 1

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. 此外,14.0% onNodeToPhysicsTransform并不意味着该函数相对无害,因为它可以在其他堆栈跟踪上调用,并且占更高的总包容百分比。)

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

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

于 2014-05-15T22:12:42.290 回答