3D ゲーム/シミュレーション エンジンの最適化の一環として、エンジンを自己最適化しようとしています。
基本的に、私の計画はこれです。まず、エンジンでフレームごとの CPU サイクル数を測定します。次に、さまざまなサブシステムが消費する CPU サイクル数 (最小、平均、最大) を測定します。
この情報が与えられると、フレーム ループの特定のいくつかのポイントで、エンジンは現在実行するのに効率的な「オプションの処理」を実行するために利用できる「余分な CPU サイクル」の数を推定できます (関連するデータは現在キャッシュにあります)。 )、ただし、現在のフレームが CPU サイクルが不足する危険がある場合は、後続のフレームまで遅延する可能性があります。
アイデアは、単調な作業でゲームを可能な限り先取りすることです。そのため、「要求の厳しいフレーム」(「単一フレーム中の多くの衝突」など)を処理するために可能なすべての CPU サイクルを利用でき、glXSwapBuffers( ) vsync の最新の可能な瞬間の前にバック/フロント バッファーを交換するのに間に合うように)。
上記の分析では、一定のフレーム レートを確保するための基本的な要件として、バック/フロント バッファーの交換が想定されています。これが唯一のアプローチではないという主張を見てきましたが、論理がわかりません。
glXSwapBuffers() の直前と直後の 64 ビット CPU クロック サイクル タイムをキャプチャしたところ、フレームが約 2,000,000 クロック サイクル異なることがわかりました。これは、glXSwapBuffers()がvsync (バッファーを交換できるとき) までブロックせず、代わりにすぐに戻るという事実によるものと思われます。
次に、glXSwapBuffers() の直前に glFinish() を追加しました。これにより、変動が約 100,000 CPU クロック サイクルに減少しました... しかし、glFinish() は 100,000 から 900,000 CPU クロック サイクルのどこかでブロックされました (おそらく、nvidia ドライバーの作業量に依存します)。バッファーをスワップする前に完了する必要がありました)。glXSwapBuffers() が処理を完了してバッファーをスワップするのにかかる時間のこの種の変動により、「スマートなアプローチ」に希望があるかどうか疑問に思います。
肝心なのは、私の目標を達成する方法がわからないということです。これはかなり単純に見え、基礎となるサブシステム (たとえば、OpenGL ドライバー) にあまり多くを要求していないようです。ただし、glXSwapBuffers() の直前に glFinish() を使用しても、「フレーム時間」に約 1,600,000 サイクルの変動が見られます。測定された「フレームあたりの CPU クロック サイクル」レートを平均し、その平均値が実際のフレーム レートであると仮定できますが、その変動が大きいと、これらの値に依存する可能性があると誤って仮定して、実際にエンジンがフレームをスキップする可能性があります。
関連するさまざまなGLX/OpenGL関数の詳細、または私が試みているよりも実際にうまく機能する可能性のある一般的なアプローチについての洞察をいただければ幸いです。
PS: 私の CPU の CPU クロック レートは、コアが遅くなったり速くなったりしても変化しません。したがって、それは私の問題の原因ではありません。