8

我有一个函数可以为我的游戏服务器中的所有玩家和对象运行 tick()。我通过每 0.1 秒循环一组来做到这一点。我需要它是一个坚实的.1。很多时间和数学取决于这个暂停尽可能精确到 0.1 秒。为此,我将其添加到刻度线:

start_time = time.time()

# loops and code and stuff for tick thread in here...

time_lapsed = time.time() - start_time # get the time it took to run the above code
if 0.1 - time_lapsed > 0:
    time.sleep(0.1 - time_lapsed)
else:
    print "Server is overloaded!"
    # server lag is greater that .1, so don't sleep, and just eat it on this run. 
    # the goal is to never see this.

我的问题是,这是最好的方法吗?如果我的循环持续时间是 0.01,那么 time_lapsed == 0.01 ... 然后睡眠时间应该只有 0.09。我问,因为它似乎不起作用。前几天我开始收到服务器超载的消息,服务器绝对没有超载。关于“动态”控制睡眠的好方法有什么想法吗?也许有另一种方法可以在不睡觉的情况下每十分之一秒运行一次代码?

4

2 回答 2

3

最好将您的“时间和数学”基于自最后一次滴答()以来实际经过的时间量。在最好的情况下,取决于“非常准确”的时间安排是脆弱的。

更新:我的意思是,您的 tick() 方法将采用自上次调用以来经过的时间的参数,例如“t”。然后,要进行运动,您将存储每个事物的位置(例如以像素为单位)和速度(以“像素/秒”为单位),因此调用 tick() 时它的运动幅度变为“速度 * t”。

这具有将物理模拟与帧速率解耦的额外好处。

我看到下面提到的 pygame:他们的“pygame.time.Clock.tick()”方法就是这样使用的,因为它返回自上次调用以来的秒数。

于 2012-11-08T17:50:56.133 回答
2

其他 Python 线程可能会在这之间运行,从而减少您的线程时间。也time.time()受制于系统时间调整;它可以被设置回来。

pygame 中有一个类似的函数Clock.tick()。其目的是限制最大帧速率。

为避免外部影响,您可以保留一个独立的基于帧/回合的计数器来测量游戏时间。

于 2012-11-08T22:57:07.370 回答