画面にレンダリングするオブジェクトの大規模な配列 (通常は 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];
});
}
}