Performance Cocos2D v.3高CPU低FPS can';这不正常吗?

Performance Cocos2D v.3高CPU低FPS can';这不正常吗?,performance,cocos2d-iphone,instruments,spritebuilder,Performance,Cocos2d Iphone,Instruments,Spritebuilder,我几乎完成了一个游戏,我注意到它的FPS低,GPU利用率高。我已经运行了一个跟踪,试图找出问题所在,但是所有的CPU时间似乎都被Cocos2D框架占用了。这是否意味着这种行为是正常的?还是我把结果解释错了?我读到,在使用渲染引擎时,空闲是不可能的,但在没有动画发生时,98%的CPU使用率似乎是非常错误的。有人能解释一下这里发生了什么吗?或者告诉我还有什么可以帮助别人的 您最重的堆栈有25层,其中9层似乎在您的代码中(Mighty Meteor?)。如果堆栈上的任何函数调用的执行次数超过了必要的次

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


您最重的堆栈有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
NodeToPhysicTransform
的调用,因为左边的数字从30.3%下降到14.0%。 但这并不意味着在
RigidBodyToParentTransform
中有大量的自我时间,因为没有。这可能只意味着它还需要花费更多的时间调用许多其他函数,没有一个函数的成本超过
NodeToPhysicTransform
。 另外,
nodetophysicsttransform
上的14.0%并不意味着该函数是相对无辜的,因为它可以在其他堆栈跟踪上调用,并且占更高的整体包含百分比。)

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

另外,分析器是否允许您查看单个堆栈样本?反对这样做的通常理由是,你看得不够多,无法获得任何统计精度。 但你不需要精确。 如果某样东西的成本为1000个样品的30%,那么该测量值的标准偏差为1.4%。 如果你在10个样本中的3个样本上看到它,它仍然是30%,但标准偏差是14%,这意味着成本大约在16%到44%之间。 如果它只有16%,你可以很容易地修复它,不是吗? 因此,统计精度并不重要。 关键的区别在于,您将能够识别出加速程序的方法,而这些方法在分析器的摘要中并不明显。 重要的是从时间的角度找出正在发生的事情,这就是检查少量随机样本所告诉你的。
这就是。

在使用版本构建配置的设备上进行测试?方案中未启用僵尸?感谢您提供如此详细的前景。我不得不读了几遍你的文章才能理解(我还没有完全理解),但我仔细研究了你指出的那些转变。结果,我运行了一个运行操作:[[u contentNode运行操作:[CCActionFollow actionWithTarget:[u rocket worldBoundary:worldYBoundary];在更新方法中。我把这个从商业罪案调查局转移到了DIDLOAD,瞧!谢谢你花这么多时间帮助我,我很难过@Dave440:太好了!如果你再这样做,你可能会找到更多的方法来加速它。如果是这样的话,你可能会把多余的周期工作,以提高现实主义的图形。