记录时间
我需要我的函数每秒更新一次时间值,有没有比设置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 个回答
你没有说明你的代码具体需要什么,所以我们无法判断在你的情况下什么是“更好”的。例如,你的应用程序是如何处理时间的?你为什么会觉得有比获取时间差更好的方法?你是否需要不同的代码片段相互同步等等?
因为你没有具体说明,我就给个全面的回答吧 :)
无论你使用什么解决方案,如果你的代码需要保持同步,那么你应该把提供时间的代码集中在一起。
在一个实时视频游戏中,这通常是在最顶层的游戏循环里完成的,时间差(来自上一次调用)会传递给更低层的代码,而不是时间索引。这样,你可以把同样的时间差传递给所有代码,并期望它们都能正常工作。
如果不需要同步(比如你不是在做基于经过时间的模拟),那么就可以在代码中随时获取当前时间,并像现在这样使用本地时间差。这种做法是可以的,因为大多数编程语言中的时钟代码都足够高级,不会导致大量代码重复。你可能会在商业应用中这样做(例如,不允许某人在某个日期或时间后进行某些操作),或者在其他应用的进度对话框中。
如果你不需要同步,也不在乎当前时间,只是需要某段代码在半定期的时间间隔内被触发,那么就简单地使用一个定时器(可以参考utdmr的回答)。
准确性:
如果你对准确计时没有强烈需求,那么你可以简单地使用一个定时器的等效物,或者让线程休眠(可以参考utdmr的回答)。
如果你的计时准确性是至关重要的(比如发射火箭),那么你的硬件、操作系统、其他应用程序、编程语言等都需要支持实时计算。这可能远超出你的需求。
如果你对准确性有一定的要求(比如在游戏中,时间的抖动或跳跃会让你的模拟看起来很不流畅,但不会造成严重后果),那么你需要一个更复杂的设置。这样的设置示例可以在这里找到:
http://gafferongames.com/game-physics/fix-your-timestep/
那段代码可能没有完全按照你的需求排列,但可以调整以适应你的应用布局。基本思路是创建一个生产者/消费者模型来处理时间,并以固定的增量分配时间。
你可以使用线程中的定时器对象: