您可能还记得,我正在尝试使用 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 教程并浏览了所有文档,但我仍然觉得我对这个主题的掌握充其量是微不足道的。谢谢!