我现在在大学里读物理,我把学习巨蟒作为一个小爱好。
为了同时练习这两者,我想我会写一个小的“物理引擎”,它根据x,y和z坐标来计算物体的运动。我只会以文本形式返回这个运动(至少现在是这样!)但我想要职位实时更新。
要做到这一点,我需要更新对象的位置,比如每秒100次,然后将其打印回屏幕上。因此,每10毫秒,程序打印当前的位置。
因此,如果计算的执行需要2ms,那么循环必须等待8ms才能打印并重新计算下一个位置。
构建这样一个循环的最佳方法是,每秒100次是一个公平的频率,或者你会慢慢来,比如25次/秒?
发布于 2014-04-23 11:34:16
在python中等待的基本方法是import time
并使用time.sleep
。那么问题是,睡多长时间?这取决于您希望如何处理循环错过所需时间的情况。如果未命中,下面的实现将试图赶上目标间隔。
import time
import random
def doTimeConsumingStep(N):
"""
This represents the computational part of your simulation.
For the sake of illustration, I've set it up so that it takes a random
amount of time which is occasionally longer than the interval you want.
"""
r = random.random()
computationTime = N * (r + 0.2)
print("...computing for %f seconds..."%(computationTime,))
time.sleep(computationTime)
def timerTest(N=1):
repsCompleted = 0
beginningOfTime = time.clock()
start = time.clock()
goAgainAt = start + N
while 1:
print("Loop #%d at time %f"%(repsCompleted, time.clock() - beginningOfTime))
repsCompleted += 1
doTimeConsumingStep(N)
#If we missed our interval, iterate immediately and increment the target time
if time.clock() > goAgainAt:
print("Oops, missed an iteration")
goAgainAt += N
continue
#Otherwise, wait for next interval
timeToSleep = goAgainAt - time.clock()
goAgainAt += N
time.sleep(timeToSleep)
if __name__ == "__main__":
timerTest()
请注意,您将错过您想要的时间在一个正常的操作系统,所以这样的事情是必要的。请注意,即使使用像郁金香和twisted这样的异步框架,也不能保证正常操作系统上的定时。
发布于 2014-04-23 11:10:28
因为您无法预先知道每次迭代需要多长时间,所以需要某种事件驱动的循环。一个可能的解决方案是使用基于twisted
的反应堆模式模块。
from twisted.internet import task
from twisted.internet import reactor
delay = 0.1
def work():
print "called"
l = task.LoopingCall(work)
l.start(delay)
reactor.run()
然而,正如已经指出的,不要期望一个真正的实时响应.
发布于 2014-04-23 11:04:24
一条警告。在非实时系统上,您可能不会期望实时。sleep
系列的呼叫至少保证了给定的延迟,但很可能会延迟更多的时间。
因此,一旦您从睡眠中返回,查询当前时间,并将计算转换为“未来”(计算时间)。
https://stackoverflow.com/questions/23252796
复制相似问题