できるだけ滑らかにする必要があるフルスクリーンでビデオを表示するアプリケーションを作成しようとしています。
私の 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 では、動作がより安定しているように見えます。しかし、現在の変動は許容範囲内です。