记录时间

2 投票
2 回答
1957 浏览
提问于 2025-04-16 12:29

我需要我的函数每秒更新一次时间值,有没有比设置t1然后检查t2 - t1是否等于1更好的方法来跟踪时间?

编辑,希望能更清楚一些:

这是轨道代码:

def orbit(center, radius, speed, t):
    theta = math.fmod(t * speed, math.pi * 2)
    c = math.cos(theta)
    s = math.sin(theta)
    x = int(round(center[0] + radius * c))
    y = int(round(center[1] + radius * s))
    coords=[x, y]
    return coords

我需要在调用绘制函数时改变t,我想限制每秒帧数(fps),并为每一帧计算t。我只看到pygame里有一个get_fps函数,它返回当前的fps,但并没有设置fps,对吗?

2 个回答

3

你没有说明你的代码具体需要什么,所以我们无法判断在你的情况下什么是“更好”的。例如,你的应用程序是如何处理时间的?你为什么会觉得有比获取时间差更好的方法?你是否需要不同的代码片段相互同步等等?

因为你没有具体说明,我就给个全面的回答吧 :)

无论你使用什么解决方案,如果你的代码需要保持同步,那么你应该把提供时间的代码集中在一起。

在一个实时视频游戏中,这通常是在最顶层的游戏循环里完成的,时间差(来自上一次调用)会传递给更低层的代码,而不是时间索引。这样,你可以把同样的时间差传递给所有代码,并期望它们都能正常工作。

如果不需要同步(比如你不是在做基于经过时间的模拟),那么就可以在代码中随时获取当前时间,并像现在这样使用本地时间差。这种做法是可以的,因为大多数编程语言中的时钟代码都足够高级,不会导致大量代码重复。你可能会在商业应用中这样做(例如,不允许某人在某个日期或时间后进行某些操作),或者在其他应用的进度对话框中。

如果你不需要同步,也不在乎当前时间,只是需要某段代码在半定期的时间间隔内被触发,那么就简单地使用一个定时器(可以参考utdmr的回答)。

准确性:

如果你对准确计时没有强烈需求,那么你可以简单地使用一个定时器的等效物,或者让线程休眠(可以参考utdmr的回答)。

如果你的计时准确性是至关重要的(比如发射火箭),那么你的硬件、操作系统、其他应用程序、编程语言等都需要支持实时计算。这可能远超出你的需求。

如果你对准确性有一定的要求(比如在游戏中,时间的抖动或跳跃会让你的模拟看起来很不流畅,但不会造成严重后果),那么你需要一个更复杂的设置。这样的设置示例可以在这里找到:

http://gafferongames.com/game-physics/fix-your-timestep/

那段代码可能没有完全按照你的需求排列,但可以调整以适应你的应用布局。基本思路是创建一个生产者/消费者模型来处理时间,并以固定的增量分配时间。

4

你可以使用线程中的定时器对象:

http://docs.python.org/library/threading.html#timer-objects

撰写回答