8

ゲームサーバー内のすべてのプレイヤーとオブジェクトに対して tick() を実行する関数があります。これを行うには、セットを 0.1 秒ごとにループします。私はそれがしっかりした.1である必要があります。多くのタイミングと計算は、この一時停止が 0.1 秒まで可能な限り正確であることに依存しています。これを実現するために、これをティック スレッドに追加しました。

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 ... となり、スリープは 0.09 だけにする必要があります。うまくいかないようなので質問します。先日、サーバーが過負荷になっているというメッセージが表示されるようになりましたが、サーバーは過負荷ではありませんでした。睡眠を「動的に」制御する良い方法について何か考えはありますか? スリープせずに 10 分の 1 秒ごとにコードを実行する別の方法があるのではないでしょうか?

4

2 に答える 2

3

最後の tick() から実際に経過した時間に基づいて「タイミングと計算」を行うことをお勧めします。「非常に正確な」タイミングによっては、最高の状態でも壊れやすくなります。

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

これには、物理​​シミュレーションをフレームレートから切り離すという追加の利点があります。

以下で言及されている pygame を参照してください。「pygame.time.Clock.tick()」メソッドは、最後に呼び出してからの秒数を返すため、この方法で使用することを意図しています。

于 2012-11-08T17:50:56.133 に答える
2

他の Python スレッドが合間に実行される可能性があり、スレッドを離れる時間が短くなります。またtime.time()、システム時間調整の対象となります。戻すことができます。

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

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

于 2012-11-08T22:57:07.370 に答える