通常通过对正在运行的程序的堆栈进行随机抽样来收集配置文件数据,以查看正在执行的功能,在运行期间,可以在统计上确定哪些方法/函数调用占用最多时间和需要干预以防止瓶颈。
然而,这与整体应用程序/游戏性能有关。有时会发生性能上存在单一且孤立的打嗝,无论如何都会导致可用性问题(用户注意到/在某些内部机制中引入滞后等)。通过几秒钟的执行定期分析不可能知道哪个。即使打嗝持续时间足够长(30毫秒,这还不够),为了检测一些经常被调用的方法,我们仍然会错过看到由于随机而被“跳过”的许多其他方法的执行取样
为了在修复那些“罕见的瓶颈”后保持帧率更稳定,有没有任何技术来描述打嗝?我假设使用C#或C ++等语言。
答案 0 :(得分:2)
之前已经回答了这个问题,但我找不到了,所以这里就是......
问题是 DrawFrame 例程有时需要太长时间。 假设它通常需要少于1000/30 = 33ms,但偶尔需要超过33ms。
在 DrawFrame 的开头,设置一个定时器中断,该中断将在40ms后过期。 然后在 DrawFrame 的末尾,禁用中断。 因此,如果它触发,您知道 DrawFrame 正在花费非常长的时间。
在中断处理程序中放置一个断点,当它到达那里时,检查堆栈。 你在做昂贵的事情的过程中抓住它的机会非常好。 这是random pausing的变体。