私はGLUTを使うと、フレームコンテンツを生成またはアニメーション化するためにフレームごとに呼び出されるコールバック関数を提供できます。ココアで1フレームに1度描く
私はCocoaで同じことをどうやって行うのですか?
私はsetNeedsDisplayがあると理解していますが、フレームごとに複数回呼び出さないようにする方法はわかりません。必要なのは、別のフレームを描画するタイミングを知らせるイベントやコールバックです。
私はGLUTを使うと、フレームコンテンツを生成またはアニメーション化するためにフレームごとに呼び出されるコールバック関数を提供できます。ココアで1フレームに1度描く
私はCocoaで同じことをどうやって行うのですか?
私はsetNeedsDisplayがあると理解していますが、フレームごとに複数回呼び出さないようにする方法はわかりません。必要なのは、別のフレームを描画するタイミングを知らせるイベントやコールバックです。
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のすべてのビューが再描画されます。
希望に役立ちます!
1/20秒が正しいレートであることをどのように知っていますか? –
実際には、ビューをアニメートする必要があるかどうかによって、実際にはちょうど依存します。アニメーションがどのくらい滑らかである必要があるかによって、24または30 fpsのフレームレートが良い場合があります。 –
さて、これはビデオのリフレッシュレートとまったく同じであるため、不要なフレームを計算することなく、できるだけスムーズです。ビデオフレームごとにタイマーコールバックを取得する方法はありますか? –