1

画面にレンダリングするオブジェクトの大規模な配列 (通常は 500 ~ 2000) があります。残念ながら、現時点ではレンダリングが正確にうまくいくとは限りません。

各オブジェクトは、ほとんどの時間を費やして最終的に画面に描画するいくつかの計算を実行する必要があります。つまり、現在、私の メソッドdrawRect:は基本的に次のようになっています。可読性

- (void)drawRect:(NSRect)dirtyRect
{
   for (Thing *thing in [self getThings])
   {
        [thing prepareForDrawing];
        [thing draw];
   }
}

並行処理の明らかな候補ですね。

実際の描画操作から準備を切り離す良いアプローチを思いつくことができませんでした。つまり、前処理を並行して実行し、すべての処理が完了するまで描画コマンドをキューに入れ、すべてを一度にレンダリングします。

しかし、 GCDの良さを考えると、以下のスキームを思いつきました。
私には問題ないように聞こえますが、GCD を初めて使用し、公開リリースの 4 週間後に奇妙なマルチスレッドの問題に遭遇する前、または一般的に悪い GCD 設計パターンを使用する前に、フィードバックを求めたいと思いました。

このアプローチの問題、潜在的な問題、またはより良い解決策を誰かが見ることができますか?

- (void)drawRect:(NSRect)dirtyRect
{
   [[self getThings] enumerateObjectsWithOptions:NSEnumerationConcurrent
                                      usingBlock:^(id obj, NSUInteger idx, BOOL *stop)
   {
      // prepare concurrently
      Thing *thing = (Thing*)obj;
      [thing prepareForDrawing];

      // always draw in main thread
      dispatch_async(dispatch_get_main_queue(), ^{
         [thing draw];
      });
   }
}
4

1 に答える 1

3

の呼び出しは完了後に[thing draw]外部で発生するため、これは機能しません。-drawRect:グラフィックス コンテキストは、そのビューへの描画に対して有効ではなくなります。

なぜ「もの」は事前に準備されていないのですか?-drawRect:計算ではなく描画用です。必要な費用のかかる計算は、事前に行っておく必要があります。

于 2013-03-30T15:22:53.057 に答える