我差不多完成了一个我注意到FPS低的游戏。一段时间后GPU利用率很高。我已经运行了一个跟踪试图找出问题,但是所有的CPU时间似乎都是由Cocos2D框架完成的。这是否意味着这种行为是正常的?或者说我错误地解释了结果?我读到使用渲染引擎时无法实现空闲,但没有动画时98%的CPU使用率似乎非常错误。任何人都可以了解一下这里发生的事情吗?或者告诉我还有什么可以发布以帮助别人帮助我?
答案 0 :(得分:1)
你最重的堆叠深度是25级,其中9个似乎在你的代码中(Mighty Meteor?)。如果堆栈中的任何函数调用正在执行的次数超过必要的次数,那么这将解释问题。让任何计算机瘫痪的最简单方法是让它在一次足够时执行两次,三次或更多次,特别是如果它在多个抽象级别完成。
ADDED:看起来像是在你的代码中的九个级别的调用是:
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%并不意味着该函数相对无辜,因为它可以在其他堆栈跟踪上调用,并且占整体包含百分比的更高。)
(另外,忽略“自我时间”。在调用其他函数的函数中,它通常是无关紧要的,此外,它包含在包含时间内。)
P.S。分析器是否允许您查看单个堆栈样本?反对这样做的通常论据是你无法看到足够的统计精度。 但是你不需要精度。 如果某些物品占1000个样品的30%,则该测量值的标准偏差为1.4%。 如果你只看到10个样品中的3个,它仍然是30%,但标准偏差是14%,这意味着成本大致在16%到44%之间。 如果它只有16%,你可以轻松修复它,不是吗? 所以统计精度并不重要。 关键的区别在于,您将能够识别加速程序的方法,这些方法在分析器的摘要中并不明显。 从时间的角度来看,重要的是找出正在发生的事情,这就是检查少量随机样本告诉你的事情。 那是this method。