「リアルタイム」に変換しようとしているシミュレーションがあります。「リアルタイム」と言うのは、必要に応じてパフォーマンスが低下しても問題ないためです (オブザーバー/クライアントの時間も遅くなります)。ただし、オブジェクトの数が少ない場合は、安定したフレーム レート (この場合は ~100 FPS) で実行されるようにパフォーマンスを制限したいと考えています。
sleep()
Linux と Windows でそれぞれとを試しましたが、FPSが実際に目標の何分の 1 かに落ち込んでいるため、Sleep()
十分に正確ではないようです。このシナリオは、ゲーム、特にオンライン ゲームでは一般的だと思いますが、この件に関して役立つ資料を見つけることができませんでした。フレーム制限の好ましい方法は何ですか? 指定された時間よりも多くの時間をあきらめないことを保証できるスリープ方法はありますか?
注: これを 2 つの異なるクラスター (Linux と Windows) で実行していますが、すべてのノードには組み込みのビデオしかありません。したがって、両方のプラットフォームで制限を実装する必要があり、ビデオカードベースであってはなりません (そのようなものがある場合でも)。また、1 つのスレッド/ノードのみに制限を実装する必要があります。これは、ノード間に既に同期があり、1 つのスレッドが適切に制限されている場合、他のノードも自動的に制限されるためです。
編集:現在のリミッターをどのように実装したかを示すいくつかの擬似コード:
while (ProcessControlMessages())
{
uint64 tStart;
SimulateFrame();
uint64 newT =_context.GetTimeMs64();
if (newT - tStart < DESIRED_FRAME_RATE_DURATION)
this_thread::sleep_for(chrono::milliseconds(DESIRED_FRAME_RATE_DURATION - (newT - tStart)));
}
また、N フレームごとに制限を行うことができるかどうかも考えていました。ここで、N は目的のフレーム レートの一部です。試してみて、また報告します。