アプリケーションでシーンをレンダリングする方法としてNSOpenGLView
usingを設定することができました。CVDisplayLinkSetOutputCallback
すべてが正しく機能しているように見え、コールバック メソッドはかなり適切な速度で起動しています。
これまでのところ、かなり前 (2009 年) のこのフォーラム スレッド (具体的には、この投稿)で見つかったコードに基づいて実装を行ってきました。
スレッドをさらに掘り下げると、物理シミュレーションなどを統合するためNSTimer
の方法を呼び出す固定ステップ間隔の設定についての言及があります。update:(NSTimeInterval)duration
ただし、フレーム間のデルタ時間も表示リンクのコールバック メソッドで計算されているようで、かなり混乱しています。
シーンを更新するための一定のステップ時間間隔をこれまで考えたことがありませんでした。正直なところ、それは私にはあまり適切ではないように思えますが、OpenGL とゲーム開発のより細かいニュアンスをまだ学んでいます。
update メソッドと render メソッドをディスプレイ リンク コールバックで結び付けるのは良い方法ですか、それとも別の場所に置く方が適しているでしょうか?
私はGLKit
iOS で使用しましたが、適切なデリゲート メソッドに準拠し、それに応じて update メソッドと render メソッドが呼び出されるという点で、すべてを起動して動作させるのは非常に簡単でした。
これまでのところ、私のコードは次のようになっています: (フォーラムスレッドで見つかったコードに基づく)
static CVReturn displayLinkOutputCallback(CVDisplayLinkRef displayLink, const CVTimeStamp *now, const CVTimeStamp *outputTime, CVOptionFlags flagsIn, CVOptionFlags *flagsOut, void *displayLinkContext)
{
NSOpenGLView *view = (__bridge NSOpenGLView *)displayLinkContext;
NSTimeInterval deltaTime = 1.0 / (outputTime->rateScalar * (double)outputTime->videoTimeScale / (double)outputTime->videoRefreshPeriod);
[view update:deltaTime];
[view drawRect:[view frame]];
return kCVReturnSuccess;
}
これは実行可能なアプローチですか?NSTimer
代わりにを使用する必要がありますか?または、おそらくより適切な代替方法はありますか?
私はあまり詳しくないCVDisplayLink
ので、シーンを更新してレンダリングするメソッドを実装するのにこれが最適な場所かどうかはわかりません。CVDisplayLink
このように使用する必要があります。つまり、シーンのレンダリングと更新をすべて 1 つにしますか?
さらに詳しい情報をいただければ幸いです。