2017-01-07 4 views
3

NSTimerを使ってMacOSで簡単なOpenGLゲームを設定しようとしていますが、実行ループをhereのように設定しています。このアイデアは、非常に小さい(〜1ms)時間間隔を持つ繰り返しタイマーを作成し、フレームレートを調整するためにvsyncに依存することです。OpenGL VSync/NSTimerがMacOSで問題

NSOpenGLContextのスワップ間隔を1に設定しています。これによりvsyncが有効になります。私はこれによって、NSOpenGLContext.flushbufferがブロックされるという印象を受けましたが、これは当てはまりません。私のレンダーコードは、毎秒60回以上頻繁に発生しています。

私がリンクしているドキュメントは廃止されているとマークされていますが、私が読んだところでは、NSTimerループを何とかディスプレイのリフレッシュレートに絞り込むことが可能です。私はこれを稼働させることができませんでしたが、私はこのアプローチがもはや実行可能ではないかと思います。

何か不足していますか?現代のプロジェクトでは、CVDisplayLinkと一緒に行くのが良いでしょうか?

答えて

2

NSTimerが毎秒約10-20回よりも頻繁に発火する可能性は低いと私は理解しています。タイマーが合流すると、このタイプのアプリケーションに適切な火災時間が得られない可能性があります。

ため、典型的な実行ループを管理し、さまざまな入力ソースの

は、タイマーの時間間隔の有効解像度は50〜100ミリ秒のオーダーに制限されている:例えば、one answer to this questiondocsが言うことを指摘します。ロングコールアウト中にタイマーの起動時間が発生した場合、または実行ループがタイマーを監視していないモードにある場合、次回実行ループがタイマーを確認するまでタイマーは起動しません。したがって、タイマーが潜在的に発火する実際の時間は、発射予定時間の後のかなりの期間である可能性がある。

CVDisplayLinkが望ましいソリューションです。使用するのも非常に簡単です。

あなたの他の質問に答えるために、はい何かが変更されました。 OSは、タイマーの処理方法を変更してエネルギー性能を向上させました。私は、あなたがOS 10.9または10.10程度まで提案している方法を使ったアプリケーションに取り組んだ。それが出てきたら、タイマーは異なった働きをしたので、私たちの戦略を再考しなければなりませんでした。