解释Time Profiler中的下降峰值

时间:2014-07-04 09:22:32

标签: ios unity3d profiling instruments

我很欣赏一些关于如何解释Time Profiler和Activity Monitor获得的结果的帮助。我在网站上找不到任何相关内容,可能是因为这个问题非常具体。但是,我想我并不是唯一一个不确定读取时间分析器上的峰值的人。

我试图找出为什么我的游戏在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上获得的,当我每帧浪费8ms:

Screenshot of Time Profiler running my time waster app

正如您所看到的,即使应用程序真的不应该导致峰值,向下的峰值仍然存在。 (你也可以看到触摸这里的效果,因为我没有触摸可见图的前半部分,并且连续触摸它的第二个。)

3)如果这是由于帧率和采样之间不同步,我预计会有更多的振荡。当然,我的应用程序将使用100%的毫秒,直到用帧完成,然后降到零?

所以我对这个问题感到很困惑。我很感激您可以提供的任何见解,如果您能告诉我如何解决它,那就更好了!

祝你好运, Tommi Horttana

1 个答案:

答案 0 :(得分:0)

你有没有尝试过Unity的探查器?它是否显示simillar结果?请注意,unity3d在ios上有两个分析器:

  1. 编辑导演 - 仅限专业人士(但有30天的试用期)
  2. internal profiler - 你必须在xcode项目的源代码中启用它

  3. 看看http://docs.unity3d.com/Manual/MobileProfiling.html,也许有些事暗示你。


    如果我不得不猜测,我会检查一个最常见的源定时hickup - 单声道垃圾收集器。

    尝试以设定的频率自行运行(例如每250毫秒)并查看模式是否存在差异:

    System.GC.Collect();