0

GLKViewオンデマンド レンダリングを使用してカスタムを構築しています。ほとんどの場合、ビューはタッチ イベントでのみ再描画されます (これは機能しています) が、ループで再描画したい短いアニメーションが時々あります。

私の最初の試みは次のようになりました:

-(void)drawRect:(CGRect)rect {
    NSLog(@"Jo");

    glClearColor(1, 0, 0, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    [self setNeedsDisplay];
}

私の理解Androidによると、これは画面をできるだけ早くクリアし続け、多くの「ジョー」を記録し続ける必要があるということでした。実際に何が起こるかというと、"Jo" はおよそ 1 秒に 1 回ログに記録され、ビューはまったくクリアされませんが、CPU使用は 0 のままです。

私が変われば

[self setNeedsDisplay];

dispatch_async(dispatch_get_main_queue(), ^{
    [self setNeedsDisplay];
});

すべてが期待どおりに機能します。

とにかくメインスレッドから呼び出されると私が理解している限りでdrawRectは、なぜdispatch_async違いが生じるのでしょうか?

だから今、私は3つの質問があります:

  1. 「Jo」ログの間のその 1 秒間に何が起こっているのでしょうか?
  2. なぜdispatch_async違いを生んでいるのですか?
  3. 本番環境でこのアプローチを使用するのは悪い習慣ですか?

どうもありがとうございました!

編集:

もう一つわからないことがあります。

このメソッドを使用している[self setNeedsDisplay];と、メイン キューの他のすべての呼び出しが不足しているように見えます。タッチ イベントが発生しなくなり、RestKit からのコールバックが配信されなくなりました。[self setNeedsDisplay];どういうわけか、キューの最後ではなく最初に追加されますか?

4

1 に答える 1