【问题标题】:How do I profile Hiccups in performance?如何在性能方面分析 Hiccups?
【发布时间】:2023-04-05 20:11:02
【问题描述】:

通常,配置文件数据是通过随机采样正在运行的程序的堆栈收集的,以查看正在执行的函数,在运行期间可以统计确定哪些方法/函数调用吃得最多遇到瓶颈时需要时间和干预。

但这与整体应用程序/游戏性能有关。有时会发生性能上的单一和孤立的打嗝,无论如何都会导致可用性问题(用户注意到它/在某些内部机制中引入了滞后等)。通过执行几秒钟的常规分析,不可能知道哪个。即使打嗝持续了足够长的时间(比如 30 毫秒,无论如何这还不够),为了检测一些被过于频繁地调用的方法,我们仍然会错过很多其他方法的执行,这些方法只是因为随机而被“跳过”抽样。

那么,在修复那些“罕见的瓶颈”之后,是否有任何技术可以分析打嗝以保持帧速率更稳定?我假设使用 C# 或 C++ 等语言。

【问题讨论】:

    标签: profiling


    【解决方案1】:

    这个问题之前已经回答过了,但是我找不到,所以这里...

    问题是 DrawFrame 例程有时需要太长时间。 假设它通常需要不到 1000/30 = 33ms,但偶尔需要超过 33ms。

    DrawFrame 的开始,设置一个定时器中断,它会在 40 毫秒后到期。 然后在 DrawFrame 结束时,禁用中断。 因此,如果它触发,您就知道 DrawFrame 会花费异常长的时间。

    在中断处理程序中放置一个断点,当它到达那里时,检查堆栈。 您很有可能在做昂贵的事情的过程中发现了它。 这是random pausing 的变体。

    【讨论】:

    • 假设耗时事件在 33 ms 后开始发生 .. ehm 在 40 ms 后发生 ..
    • @DarioOO:并不是说它在 40 毫秒后开始发生,而是在 40 毫秒后仍然发生。
    • 我们可能会有延迟,因为通常在 1-3 毫秒之间发生的事情持续了 1 到 30 毫秒(在帧的开头)。如果使用这种方法,我们会完全错过这一点。(所以有些事件无法通过 33 毫秒的中断来捕获。
    • @DarioOO:这就是为什么“机会非常好”。一个聪明的程序可以弄清楚如何对你隐藏 :) 只需做一个中断,然后尝试不同的延迟。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-01
    • 2017-07-11
    • 2010-09-22
    • 2018-06-13
    相关资源
    最近更新 更多