跟踪时间

时间:2011-02-24 20:37:00

标签: python time

我需要我的函数每秒更新一次新的时间值,有没有更好的方法来保持跟踪,而不是设置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没有设置它或者我错了吗?

2 个答案:

答案 0 :(得分:4)

您可以使用线程的Timer对象:

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

答案 1 :(得分:3)

您尚未指定任何有关代码需求的内容,因此我们无法确定您的方案中哪些内容“更好”。例如。你的应用程序如何处理时间,为什么你会想到有一个更好的方式而不是采取三角洲?您是否需要不同的代码片段才能彼此同步?

既然你没有指明,我会给出一个无所不包的答案:)

无论您使用何种解决方案,如果您的代码需要同步,那么您应该集中提供时间的代码。

在实时视频游戏中,这通常在顶级游戏循环中完成,时间增量(来自之前的调用)传递给较低级别​​的代码,而不是时间索引。这样,您可以将相同的增量传递给所有代码,并期望它们都能正常运行。

如果它不需要同步(你没有根据经过的时间进行模拟),那么只需获取整个代码中的当前时间,然后像当前一样获取本地增量。这是一个很好的做法,因为大多数编程语言中的时钟代码足够高,您不会有重要的代码重复。您可以在业务应用程序中执行此操作(例如,不允许某人在日期或时间之后执行某些操作),或者在任何其他应用程序的进度对话框中执行此操作。

如果你不需要同步,并且实际上并不关心当前时间是什么,而只需要半定期启动一些代码,那么只需使用一个计时器(参见utdmr的答案)。 / p>

精度:

如果您对精确计时没有强烈需求,那么您可以简单地使用等效的计时器或线程睡眠(请参阅utdmr的答案)。

如果您对计时准确性有任务关键需求(例如启动火箭),那么您的硬件,操作系统,其他应用程序,编程语言等都需要支持实时计算。这可能超出了你想要的范围。

如果你对准确性有一些强烈的需求(例如游戏,你的计时中的抖动或跳过将使你的模拟显然是混蛋,但不会结束世界),那么你将需要一个更复杂的设置。这里有一个例如设置的例子:

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

该代码可能无法按照您的需要进行精确安排,但它可以按摩以适应您的应用程序的布局。基本前提是制作时间的生产者/消费者模型,并以固定的增量对其进行分割。