覚えているかもしれませんが、私はGCDを使用して、コードの一部、つまり衝突検出および解決エンジンを高速化しようとしています。ただし、すべてのGCDコードがシリアルコードよりも大幅に遅く、一貫性が低いため(1.4倍から10倍遅い)、明らかに間違ったことをしています。例を挙げましょう。バブルソート方式で配列を反復処理して、その配列内のオブジェクト間で発生する可能性のあるすべての衝突を特定します。
- (double) detectCollisionsInArray:(NSArray*)objects
{
int count = [objects count];
if (count > 0)
{
double time = CFAbsoluteTimeGetCurrent();
for (int i = 0; i < count; i++)
{
for (int j = i + 1; j < count; j++)
{
/** LOTS AND LOTS OF WORK FOR EACH OBJECT **/
}
}
return CFAbsoluteTimeGetCurrent() - time;
}
return 0;
}
非常に簡単で、問題の制約を考えるとうまく機能しているようです。ただし、コードセクションで各オブジェクトの状態が変更されていないことを利用し、GCDを使用してこの作業を並列化したいと思います。これを行うために、私は次のようなことを試みています:
- (double) detectCollisionsInArray:(NSArray*)objects
{
int count = [objects count];
if (count > 0)
{
NSOperationQueue* opQueue = [[NSOperationQueue alloc] init];
NSBlockOperation* blockOperation = nil;
double time = CFAbsoluteTimeGetCurrent();
for (int i = 0; i < count; i++)
{
for (int j = i + 1; j < count; j++)
{
void (^workBlock) (void) = ^()
{
/** LOTS AND LOTS OF WORK FOR EACH OBJECT **/
};
if (!blockOperation)
{
blockOperation = [NSBlockOperation blockOperationWithBlock:b];
}
else
{
[blockOperation addExecutionBlock:workBlock];
}
}
}
[opQueue addOperation:blockOperation];
[opQueue autorelease];
return CFAbsoluteTimeGetCurrent() - time;
}
return 0;
}
誰かが私を正しい軌道に乗せるのを手伝ってくれて、おそらく良いGCDチュートリアルへのリンクを提供できますか?私はいくつかのGCDチュートリアルを調べ、すべてのドキュメントを精査しましたが、それでもこの主題についての私の理解はせいぜい希薄であると感じています。ありがとう!