2012年2月1日水曜日

Display Link (ディスプレイリンク)

Core Video に関する処理は全てOSがスクリーンの1フレームを描き始める前に完了しなければならないから,スクリーンリフレッシュのタイミングは重要です.8-bit時代からのプログラマはVsync割り込みを思い出して下さい.一般に,ユーザランドのソフトウェアからはリフレッシュのタイミングを知ることは出来ないので,何らかのリフレッシュ通知メカニズムが必要になります.

そのために Core Video では Display Link (ディスプレイリンク)という枠組みを用意しています.Display Link は8-bit時代のVsync割り込みとは違い,アプリとは独立したプライオリティの高いスレッドで走り,スクリーンごとに最適なタイミングを推測して,定期的にユーザ定義関数をコールバックする機能です(図参照).



QTCoreVideo101 の例だと以下の関数がコールバック関数です.

static CVReturn MyRenderCallback(CVDisplayLinkRef displayLink,
                                 const CVTimeStamp *inNow,
                                 const CVTimeStamp *inOutputTime,
                                 CVOptionFlags flagsIn,
                                 CVOptionFlags *flagsOut,
                                 void *displayLinkContext)
{
  return [(MyOpenGLView *)displayLinkContext
    getFrameForTime:inOutputTime flagsOut:flagsOut];
}


見ての通り MyOpenGLView のメソッドをC関数としてラップしているだけです.その実体は以下にあります.

- (CVReturn)getFrameForTime:(const CVTimeStamp*)timeStamp 
                   flagsOut:(CVOptionFlags*)flagsOut
{
  // ...
}











0 件のコメント:

コメントを投稿