2012-11-08 3 views
8

私はゲームサーバー内のすべてのプレーヤーとオブジェクトに対してtick()を実行する関数を持っています。私は1秒ごとにセットをループすることでこれを行います。私はそれが固体であることが必要です.1。多くのタイミングと数学はこのポーズができるだけ正確に0.1秒になることに依存します。これを達成するために、私はティックスレッドにこれを追加しました:Python - time.sleep()はコードの長さによってオフセットされます

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 ...そしてsleepは0.09にしかならないはずです。それは働いていないように私は尋ねます。私は先日、過負荷のサーバーメッセージを取得し始めました。サーバーは、間違いなく過負荷になっていませんでした。睡眠を「動的に」制御する良い方法についての考えはありますか?たぶん、寝ることなく10分の1秒ごとにコードを実行する別の方法がありますか?

+0

私は 'try:time.sleep(0.1-elapsed);を実行します。 except文を使って計算時間を短縮するために 'pass'を使います。しかし、他のすべてはよさそうだよ – inspectorG4dget

+1

何らかの理由で、目盛りのためのループとコードやものが100ミリ秒以上かかることは明らかです。サーバーが「間違いなく過負荷にならない」ことをどのように確信していますか? – bdares

+0

あなたはどのオペレーティングシステムを使用していますか? –

答えて

2

他のPythonスレッドは、スレッドの間に実行される可能性があります。また、time.time()は、システム時間の調整が必要です。それは元に戻すことができます。

同様の機能がありますClock.tick() in pygameです。その目的は最大フレームレートを制限することです。

外部の影響を避けるために、独立したフレーム/ターンベースのカウンターでゲーム時間を測定することができます。

+0

ああ!だから、もし私がこの権利を理解していれば、time.timeとtime.sleepを完全に削除し、Clock.tick(10)を追加すれば、私のティックスレッドを10ループに制限します。 。そうですか? – jtsmith1287

3

「タイミングと数学」は、最後のティック()以降に実際に経過した時間に基づいている方がよいでしょう。 「非常に正確な」タイミングに応じて、最適なタイミングで脆弱になります。

更新:私が言っていることは、あなたのtick()メソッドが、最後の呼び出しからの経過時間の引数、「t」を取るということです。次に、動きを行うには、tick()への呼び出しの動きの大きさが「velocity * t」になるように、それぞれの位置(ピクセル単位)と速度(「pixels/second」単位)を格納します。

これには、物理​​シミュレーションとフレームレートのデカップリングの利点があります。

「pygame.time.Clock.tick()」メソッドは、最後に呼び出した後の秒数を返すので、この方法で使用することを意図しています。

+0

このアイデアをもう少し説明してもよろしいですか?期待しているように聞こえますが、わかりません。 – jtsmith1287

関連する問題