2009-06-27 1 views
1

私はGLUTを使うと、フレームコンテンツを生成またはアニメーション化するためにフレームごとに呼び出されるコールバック関数を提供できます。ココアで1フレームに1度描く

私はCocoaで同じことをどうやって行うのですか?

私はsetNeedsDisplayがあると理解していますが、フレームごとに複数回呼び出さないようにする方法はわかりません。必要なのは、別のフレームを描画するタイミングを知らせるイベントやコールバックです。

答えて

3

Cocoaのすべてがバッファリングされているので、再描画せずにビューを移動、アニメーション化、調整することができます。ビューを何度も再描画する必要がある場合(たとえば、drawRect:を繰り返し呼び出して独自のアニメーションを作成する場合)、毎秒1/20秒ごとに起動するタイマーを作成し、ビューの更新をトリガーする必要があります。

[NSTimer scheduledTimerWithTimeInterval:1.0/20.0 target:self selector:@selector(animate) userInfo:nil repeats:YES]; 

あなたのコールバック関数(この場合は「アニメイト」で)次のようになります。

あなたはこのようなタイマーを作成することができます。アニメーションにビジネスロジックが必要な場合は、ここに配置する必要があります。ビューのdrawRect関数内ですべての描画を行う必要があります。

- (void)animate { 
    [animatedView setNeedsDisplay: YES]; 
} 

setNeedsDisplayをフレームごとに複数回呼び出すことは安全です。 SetNeedsDisplayはビューにフラグを設定し、実際には描画を実行しません。コードが実行され、アプリケーションがメイン実行ループに戻ると、setNeedsDisplay = YESのすべてのビューが再描画されます。

希望に役立ちます!

+0

1/20秒が正しいレートであることをどのように知っていますか? –

+0

実際には、ビューをアニメートする必要があるかどうかによって、実際にはちょうど依存します。アニメーションがどのくらい滑らかである必要があるかによって、24または30 fpsのフレームレートが良い場合があります。 –

+0

さて、これはビデオのリフレッシュレートとまったく同じであるため、不要なフレームを計算することなく、できるだけスムーズです。ビデオフレームごとにタイマーコールバックを取得する方法はありますか? –

関連する問題