【发布时间】:2014-07-04 09:22:32
【问题描述】:
如果我应该如何解释从 Time Profiler 和 Activity Monitor 获得的一些结果,我将不胜感激。我在网站上找不到任何内容,可能是因为这个问题相当具体。但是,我想我不是唯一一个不确定要从 Time Profiler 上读取到什么尖峰的人。
我正试图弄清楚为什么我的游戏在 iPhone 4 上经常出现卡顿。我正试图以 60 FPS 的速度运行它,所以我知道在这么旧的设备上这很棘手,但我知道其他一些游戏管理得很好。我正在使用 Unity,但这是关于解释仪器结果的更一般的问题。我没有足够的声誉来发布图片,而且我只能发布两个链接,所以我无法发布我想要的所有内容。
这是我在 Time Profiler 上运行游戏的结果:
Screenshot of Time Profiler running my game
据我了解(但如果我错了,请纠正我),此图表显示了我的游戏在 Time Profiler 占用的每个样本期间使用了多少 CPU(我已将样本设置为每毫秒采集一次) )。如您所见,该图表中经常出现向下的尖峰,这(基于在游戏进行时查看游戏本身)与游戏中的小插曲相吻合。
此外,当我触摸设备时,尖峰更为常见,尤其是当我在其上连续移动手指时(这是我在玩上面的游戏时所做的)。 (因为我的游戏需要触摸,所以我无法制作类似的非触摸版本,但请参阅下面的比较。)
这里让我感到困惑的是尖峰是向下的:如果我的代码效率低下,在某些帧上进行了太多计算,我希望看到向上的尖峰,现在是向下的。以下是我设法提出的理论:
1) 向下的尖峰代表其他东西占用了 CPU 时间(例如,后台任务,或者 CPU 的速度本身在变化,或其他东西)。由于可用于处理的时间较少,我会遇到问题,并且它还显示为我的应用使用较少的 CPU。
2) 我的代码实际上效率低下,时不时地导致峰值。因为处理镜头并没有在一帧内完成,它会继续下一帧,但只需要一点额外的时间。这意味着在第二帧上,它使用的 CPU 更少,导致向下峰值。 (据我了解,iOS 帧总是等长,比如 1/60 秒,因此即使我们在第二帧上多花一点时间,第三帧也不能提前开始。)
3)这只是一个采样问题,由于采样频率为1ms,而帧长约为16ms。
这两种理论对我来说都是有意义的,也可以解释为什么我们的游戏会出现问题,而一些轻量级的游戏则不会。 1) 较轻的游戏不会因为 CPU 被盗而受到如此严重的影响,因为它们一开始不需要那么多 CPU。 2) 较轻的游戏本身没有那么多的尖峰。
但是,其他一些测试似乎与这些理论背道而驰:
1) 如果帧总是像这样被盗,我预计其他游戏也会出现类似的峰值。但是,在使用另一款游戏(来自 App Store,也使用 Unity)进行测试时,我没有得到它们(我有一张图片可以显示,但不幸的是我无法发布它)。
注意:这款游戏在 Time Profiler 中运行时也有很多小问题,因此小问题似乎并不总是意味着向下的尖峰。
2) 为了验证我的应用程序只是在加速的假设,我编写了一个程序(再次在 Unity 中),它浪费了每帧一致的毫秒数(通过运行一个循环,直到根据系统时钟经过指定的时间)。这是我在 Time Profiler 上让每帧浪费 8 毫秒时得到的结果:
Screenshot of Time Profiler running my time waster app
如您所见,向下的尖峰仍然存在,尽管该应用确实不应该导致尖峰。 (这里也可以看到触摸的效果,可见图的前半部分我没有触摸,后半部分是连续触摸的。)
3) 如果这是由于帧速率和采样之间的不同步,我预计那里会有更多的振荡。当然,我的应用会使用 100% 的毫秒数,直到它完成一帧,然后降至零?
所以我很困惑该怎么做。如果您能对此提供任何见解,我将不胜感激,如果您能告诉我如何解决它,那就更好了!
最好的问候, 汤米·霍塔纳
【问题讨论】:
标签: ios unity3d profiling instruments