Windows フォームを使用して小さな OpenGL アプリケーションをプログラミングしているときに、プロファイラーを使用していて、かなり不安定だと思われるものを発見しました。
System::Windows::Forms::Timerを使用して、マウスのアイドリングとその他のユーザー入力の組み合わせを検出しています。ティック機能は便利ですが、タイマーを「リセット」したい場合があります。これを直接行うことはできませんが、次のようにすることで正しい効果が得られます。
this->someTimer->Stop();
this->someTimer->Start();
タイマー間隔は 50ms です。ここでの「リセット」コードは、30 ミリ秒ごとに実行されることがあります。驚いたことに、これは非常に負担のかかる作業です。私のプログラム実行の 30% は、多くの場合、この 2 行で行われます。そして、これらの 2 つの行を頻繁に呼び出しているわけではありません。特定の不自然な状況では、このコードは例と同じくらい頻繁に呼び出されますが、それ以上は呼び出されOpenGLSwapBuffers()
ません。これは、これら 2 行のコストがレンダリング ループ全体の約半分であることを意味していると解釈します。
現在、回避策を使用していますが、タイマー メソッドはもう少しエレガントです。私は非常に興味があります.なぜこれらの2行は計算コストが高いのですか? 私は何が欠けていますか?タイマーをリセットするより良い方法はありますか?