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 に答える