【问题标题】:Interpreting downward spikes in Time Profiler解释 Time Profiler 中的向下尖峰
【发布时间】: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


    【解决方案1】:

    你试过Unity的分析器吗?它是否显示相似的结果?请注意,unity3d 在 ios 上有 两个 分析器:

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

    看看http://docs.unity3d.com/Manual/MobileProfiling.html,也许会有提示。


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

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

    System.GC.Collect();
    

    【讨论】:

    • 感谢您的回复!
    • 是的,我现在正在再次研究垃圾收集,但它似乎运行得太少,无法解释这些打嗝(大约每 30 秒一次),尽管它通常需要足够的毫秒才能合理地引起打嗝。 Unity 分析器并没有太大帮助,因为首先它只是通过运行将我的性能减半。除了明显的、大量的浪费时间之外,我真的不相信 iPhone 的结果。对于随机打嗝,它似乎总是将它们分配给渲染,但我们的渲染是相当静态的,所以我不希望那里有太多变化。
    猜你喜欢
    • 1970-01-01
    • 2010-09-19
    • 2015-01-10
    • 2017-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-07
    • 1970-01-01
    相关资源
    最近更新 更多