0

我正在尝试在 wxPython 应用程序中运行物理模拟(使用 ODE)。我的第一次尝试使用计时器以 100Hz 的频率运行我的模拟,但实际上它以接近 60Hz 的频率运行。模拟的速率准确很重要,因此我编写了一个小线程,它会休眠 0.01 秒,然后(通过 wx.PostEvent)向运行(和渲染)模拟的主 UI 线程发送一条消息。

这完全挂起了应用程序,并且从日志记录中我可以看到并非我发送的所有事件(以 100Hz 频率)都在处理中。因此,我假设我正在填满消息队列并且我的 UI 停止运行。

当我将线程设置为以 50Hz 运行时,一切正常。但我的意思是,这是 2012 年,我有 8 个内核以荒谬的千兆赫或其他频率运行。在我看来,准确的 100Hz 似乎并没有要求那么多。从长远来看,它只需要准确,一些抖动(比如说 10%)就可以了。

有任何想法吗?顺便说一下,这是我的线程代码

def TimerThreadFunction(self):
    while self.ContinueTimer:
        time.sleep(0.01)
        wx.PostEvent(self.frame, TickEvent())
4

1 回答 1

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()
于 2012-05-16T03:00:06.817 回答