4

できるだけ滑らかにする必要があるフルスクリーンでビデオを表示するアプリケーションを作成しようとしています。

私の OpenGL コードは垂直リフレッシュ同期に同期されており、ほとんどの場合、CPU 使用率が低くても再生はスムーズです。

ただし、時々、わずかな吃音があります。

テストを簡素化し、潜在的な遅延の原因を排除するために、フルスクリーンを作成し、フレームをクリアし、バッファを交換するだけの単純なレンダリング ループを作成しました。

バッファーのスワップ時間を ( mach_absolute_time() で) 計測し、15 ~ 18 ミリ秒の範囲外の時間を出力しました。

実行例を以下に示します (レポート時間は秒単位、フレーム時間はミリ秒単位です)。

at time:0.903594 ->  frame time:06.943 ms
at time:1.941287 ->  frame time:20.801 ms
at time:1.956124 ->  frame time:14.725 ms
at time:1.969766 ->  frame time:13.533 ms
at time:4.059608 ->  frame time:23.808 ms
at time:4.068953 ->  frame time:09.255 ms
at time:6.090000 ->  frame time:55.086 ms
at time:6.090681 ->  frame time:00.210 ms
at time:6.101372 ->  frame time:10.659 ms
at time:9.684669 ->  frame time:18.014 ms
at time:15.032867 -> frame time:18.463 ms
at time:15.047580 -> frame time:14.618 ms
at time:17.028749 -> frame time:65.096 ms
at time:17.028962 -> frame time:00.108 ms
at time:17.037022 -> frame time:08.034 ms
at time:17.049193 -> frame time:12.069 ms
at time:17.063416 -> frame time:14.130 ms

テストの時点では、XCode から別のアプリケーションを実行していませんでした。テストは、OS X 10.7.5 を実行する Macbook Pro 5,1 で実行されました。

グラフィックスの切り替え (このラップトップには Nvidia 9600 と 9400 が搭載されています)、外部モニターまたはラップトップ画面から実行しても違いはありませんでした。

基礎となる API 間の違いを排除するために、SDL、Glfw、Cinder、SFML などのグラフィックス フレームワークを使用して同じコードを試しました。最後に、公式の Apple OpenGL フルスクリーンの例のタイミングも試しました。Glfw はもう少し安定しているように見えますが、それらはすべて多かれ少なかれ同じように動作します。

SCHED_FIFO ポリシーを使用して描画スレッドの優先度を最大に上げると、状況が少し改善されるように見えますが、それほどではありません。

私は、OpenGL から安定した 60hz フレーム レートを取得することは不可能であると考え始めています。

OS X でフルスクリーンの OpenGL アプリケーションの安定した 60hz 表示レートを実現できた人はいますか? どのように?

編集:ターミナルからテストを実行すると、タイミングが大幅に改善されることに気付きました。XCode から実行すると、より多くの変動が発生するため、これらの数値を使用して結論を​​導き出しました。いずれにせよ、同じマシン上の Windows 7 では、動作がより安定しているように見えます。しかし、現在の変動は許容範囲内です。

4

1 に答える 1

0
  1. ビューポートが画面全体ではなく小さなウィンドウの場合、このテストはどうなるでしょうか? 100x100 のウィンドウでも動作が同じであれば、GPU のパフォーマンスの問題ではないと推測できます。

  2. GLFinish() を呼び出していますか? そうでない場合、グラフィックス ドライバーは、必要に応じていつでも自由に結果を画面に出力できます。その結果、パフォーマンスのスパイクが発生する可能性があります。

  3. 使用しているタイマーの分解能は? Windows で自分のコードをベンチマークしようとして、同様の問題に遭遇しました。標準の Windows タイマーの解像度はひどい (~ 19ms) ため、より高い解像度のタイマーに切り替える必要がありました。

于 2012-11-11T06:14:38.983 に答える