gpt4 book ai didi

loops - 分析循环中的周期时间抖动

转载 作者:行者123 更新时间:2023-12-01 11:21:44 25 4
gpt4 key购买 nike

我在制作游戏时遇到了一个小问题,虽然问题不仅限于游戏编程本身,但我将用我遇到的具体示例来表达它:

正如预期的那样,我正在循环运行游戏代码,控制游戏逻辑并在每个循环中绘制一个框架。但是,在完成每个周期所需的时间中,我遇到了相当多的抖动。正常循环时间在最短和最长测量时间之间变化大约两倍,有时(更罕见)会出现较大的尖峰,需要相当长的时间。

我想消除两者。我想消除正常抖动以使绘图更平滑,并且我想消除尖峰,因为它们很明显且令人讨厌。问题是,我不知道是什么代码导致它们出现。我曾尝试测量几个特定的​​代码路径或收集系统资源使用情况,但到目前为止它只是有帮助。

我想做的是能够运行 CPU 分析器,在每个周期重置其计数器数据。这样,我可以轻松地逐帧比较花费时间的帧以及哪些代码路径本身或多或少地抖动。但是我该怎么做呢?我在 Java 和 C 以及 Java 的 -Xprof 中都遇到了问题。选项和 GCC 的 gprof程序打印仅从程序生命周期的开始到结束测量时间(如预期的那样)。有什么方法可以在每个周期转储和重置这些分析器的数据和/或是否有其他一些我可以尝试提供该功能的分析器?我也认为它们都只需要大约 100 个样本/秒,当一帧只需要大约 10-20 毫秒时,分辨率是非常不足的。有没有办法提高他们的采样率?

或者,当然 - 有没有其他完全可以解决这些问题的方法?

最佳答案

让我们考虑一下 C 代码,所以我们不包括 GC 时间。

我认为多余的时间不会发生在每一帧上,但很少发生,所以任何只测量聚合时间的分析器都不会告诉你太多。

我要做的(这可能并不容易)是尝试告诉程序仅在它运行时正在做什么,而不是一直。
如果可能的话,在每一帧开始时,我会设置一个闹钟计时器,设置为在足够的毫秒数后关闭,以便在额外时间的某个地方触发。
然后在计算帧结束时,我会禁用计时器,这样它就不会在帧完成后关闭。
向计时器添加少量随机毫秒数可能很有用。

然后当计时器关闭时,我会收集一个堆栈样本并研究它,看看程序在做什么。

可能很难收集样本并将它们保存起来以供日后查看。
在警报响起时简单地进入调试器并研究堆栈以及当时程序正在做什么可能更容易且信息量更大。
要获得另一个样本,要么恢复执行,要么从头开始。

关键是,您想知道它在做什么以及为什么在多余的时间内这样做。
你希望它正在做的多余的工作,或者其中的一部分,是在这段多余的时间里发生的。

在看到有趣的东西之前,您可能需要多达 20 个样本,
但是,一旦不止一个样本显示发生了一些您并没有真正意识到它正在发生的事情,并且您可以摆脱它,这将大大减少多余的时间使用。
在你看到之前你必须采取的样本越少,时间就会减少得越多。

可能有不止一个这样的问题,所以不要在你发现的第一件事之后停下来。
一遍又一遍地做,直到找不到任何可以删除的东西。

关于loops - 分析循环中的周期时间抖动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8901747/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com