我正在尝试在wxPython应用程序中运行物理模拟(使用ODE)。我的第一次尝试是使用计时器以100Hz运行我的模拟,但是这实际上是在接近60Hz的情况下运行。重要的是模拟的速度是准确的,所以我写了一个小的线程,睡眠时间为0.01秒,然后发送一条消息(通过wx.PostEvent)到运行(和渲染)模拟的主UI线程。 p>
这完全挂起了应用程序,从日志记录中我可以看到并非所有正在发送的事件(100Hz)正在处理中。因此,我认为我正在填写消息队列,我的UI会停止运行。
当我将线程设置为以50Hz运行时,一切正常。但我的意思是,这是2012年,我有八个核心运行在一些荒谬的千兆赫兹或其他什么。在我看来,准确的100Hz并不是那么多。从长远来看,它只需要准确,一些抖动(假设10%)完全没问题。
有什么想法吗?这是我的线程代码
def TimerThreadFunction(self):
while self.ContinueTimer:
time.sleep(0.01)
wx.PostEvent(self.frame, TickEvent())
答案 0 :(得分:0)
如果只是实时模拟,您可以使用总模拟时间调整每个步骤的睡眠时间:
import time
def sim_step():
import random
for i in xrange(random.randint(1000, 10000)):
pass
start = time.time()
sim_time = 0
while True:
sim_step()
sim_time += 1
to_sleep = max(0, sim_time*0.001 - (time.time() - start))
time.sleep( to_sleep )
if sim_time % 1000 == 0:
print sim_time, time.time()