TadaoYamaokaの日記

山岡忠夫Homeで公開しているプログラムの開発ネタを中心に書いていきます。

【iOS開発】フレームレートに合わせて描画する

今まで音声解析の結果を画面に表示する際に、AudioQueueNewInputのコールバックで、UIViewのsetNeedsDisplayを呼ぶようにしていましたが、最新のXcodeだと、メインスレッドで呼ぶように警告がでるようになっていました。

元々UIViewの処理は、すべてメインスレッドで処理する必要がありましたが、AudioQueueNewInputのコールバックで処理しても特に問題なく動いていました。
しかし、作法に従った方がよいので、メインスレッドで処理する方法を調べました。

タイマーを使って定期的に描画する方法もありますが、フレームレートと同期して描画できた方がちらつきを抑えることができます。
調べたところ、以下のようにすればフレームレートと同期して描画できました。

MainView.h
@interface MainView : UIView
@property CADisplayLink* displayLink;
@end
MainView.m
- (id)initWithCoder:(NSCoder *)aDecoder {
    // ...
    _displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(setNeedsDisplay)];
    [_displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

これで、フレームレートと同じ間隔で、setNeedsDisplayが呼ばれるようになります。