2011-06-19 11 views
5

私は2Dグラフィックスをフレームバッファにレンダリングするシンプルなゲームを持っています(OpenGLを使用していません)。クリーンなフレームレートを得るためにCVDisplayLinkを使用するつもりでしたが、Web上のほとんどの例はOpenGLやQuickTimeを扱っています。CVDisplayLinkコールバックの中からNSViewグラフィックスコンテキストに描画する方法は?

これまでのところ、私はNSViewののサブクラスがあります。

@interface GameView : NSView { 
@private 
    CVDisplayLinkRef displayLink; 
} 

- (CVReturn)getFrameForTime:(const CVTimeStamp*)outputTime; 
@end 

をそして、私はCVDisplayLinkコールバック設定:

CVDisplayLinkSetOutputCallback(displayLink, MyDisplayLinkCallback, self); 

をそして、私はコールバック関数を持っている:

私が立ち往生している部分は、getFrameForTime:でGameViのグラフィックスコンテキストに描画することですew。通常、ビューの現在のコンテキストを作るdrawRect:前に起こるいくつかのセットアップがある - 私の最初の推測がdrawRect:

- (CVReturn)getFrameForTime:(const CVTimeStamp*)outputTime 
{ 
    CGContextRef ctxCurrent = [[NSGraphicsContext currentContext] graphicsPort]; 

    //.. Drawing code follows 
} 

しかしctxCurrentにあなたが希望描くのと同じ方法を行うことだった私は、私は理解して考えるnilです。私はこれが私が欠けている部分だと思う。私の見解の文脈をどうやって得るのですか?

または私はこれについてすべての間違った方法で行っていますか?

答えて

2

‑drawRect:に図面コードを残しておき、MyDisplayLinkCallback()に現在の時刻にivarを設定し、‑displayを呼び出して表示することができます。これにより、ビューはすぐに再描画されます。

‑drawRect:メソッドでは、現在のアニメーションフレームのビューを適切に更新するために必要な描画を行うには、time ivarの値を使用します。

+0

ありがとうございます、これは動作しており、これまでに私が見つけた最もクリーンなようです。 – John

0

別の-draw:メソッドを作成し、MyDisplayLinkCallback()-drawRect:から呼び出す必要があります。

私はRob Kenigerのresponseを見つけて試しました。悲しいことに、表示リンクのコールバックから-displayに電話をかけると、アプリを終了するときにアプリがデッドロック状態でハングすることがあり、アプリを強制終了することがあります。

+1

Rob Kenigerさんの反応へのリンクを追加してください。それを見るのはかなり面白いだろう。 – SalmonKiller

+0

@SalmonKiller:どうすればリンクできますか?それは私のすぐ上で現在受け入れられている答えです。 – placeitintheblob

関連する問題