0

私はOpenGLSuperbible5thedを進めています。画面に回転トーラスを表示するサンプルコードがあります。プロセッサの速度に関係なくローテーションが行われるようにするため、ローテーションの量は時間に基づいています。私の質問:以下のサンプルコードで、正しい時間がメソッドに渡されることを「確実に」するにはどうすればよいm3dRotationMatrix44() ですか?つまり、その後rotTimer.GetElapsedSeconds()、OSが他のタスクで動作し、その後に戻るのを妨げるものは何m3dRotationMatrix44()ですか?または、これはチュートリアル用の基本的なタイミング手法ですか?その場合、他にどのような方法がありますか?

// Set up time based animation
static CStopWatch rotTimer;
float yRot = rotTimer.GetElapsedSeconds() * 60.0f;

// <initialize some stuff>

// Create a rotation matrix based on the current value of yRot
m3dRotationMatrix44(mRotate, m3dDegToRad(yRot), 0.0f, 1.0f, 0.0f);
4

3 に答える 3

1

タイマークエリを使用している場所のできるだけ近くに配置するだけで、あまり心配する必要はありません。60 Hzでは、とにかく16ミリ秒ごとにフレームを描画するだけなので、ステップの粒度は少なくともそれだけであることに注意してください。ほとんどこのアプリケーションを実行している(そして他のプロセスによってロードされていない)マシンでは、コンテキスト切り替え時間は大きな違いを生みません。

あなたがそれについて考えるならば、あなたの実行が別のプロセスによって中断されないことを保証するためにあなたのユーザースペースアプリケーションができるべきことは実際には何もありません。コンテキスト切り替えはカーネルによって処理されます。公平を期すために、ユーザースペースプロセスがすべての実行時間を「占有」できないようにする必要があります。コンテキスト切り替えはカーネルに対して完全に透過的である必要があります。

于 2013-02-04T18:47:22.813 に答える
1

すべてが正しく行われていれば、OSがrotTimer.GetElapsedSeconds()と計算の間に何かを実行することを心配する必要はありません。「rotTimer.GetElapsedSeconds()」は、あなたのものや他のタスクに費やされた累積遅延を返します。ただし、各フレームですべての時間ベースの操作に同じ値を使用する必要があります(.GetElapsedSeconds()をフレームごとに1回だけ呼び出し、その値をどこでも使用します)。

注意すべきことは、遅延が大きすぎたり小さすぎたりする可能性があるということです。この問題に取り組むにはいくつかのアプローチがあります。最も簡単なのは、最大フレーム長を設定することです。このようなもの:

float yRot = max(rotTimer.GetElapsedSeconds(), 0.3f) * 60.0f;
于 2013-02-05T05:19:53.083 に答える
0

プログラムのデフォルトで実行されている間、他のプロセスの実行を妨げるものは何もありません。これは行わないでください。ただし、Windows API関数のSetPriorityClassおよびSetThreadPriorityを実際に使用する必要がある場合は、プロセスの優先度を変更して、コンピューター上の他のプロセスをプリエンプトできます。これらをリアルタイムに設定することは、コンピューターを強制終了するための良い方法です。:-)

于 2013-02-07T19:36:31.407 に答える