我想渲染 30 个不同的图像。每个任务都必须将不同的图像层合并成一个最终图像——30 个最终图像。
目前我使用 GCD 串行队列。现在我想知道这种方法是否自动使用所有可用内核的 CPU 能力?
或者我可以在使用 GCD 并发队列时改善所有这些任务的渲染时间吗?谢谢你的澄清。。
我想渲染 30 个不同的图像。每个任务都必须将不同的图像层合并成一个最终图像——30 个最终图像。
目前我使用 GCD 串行队列。现在我想知道这种方法是否自动使用所有可用内核的 CPU 能力?
或者我可以在使用 GCD 并发队列时改善所有这些任务的渲染时间吗?谢谢你的澄清。。
串行队列 = 1 个任务 = 1 个内核。但是您的用例中的真正问题是 I/O 争用。如果您生成一个并发队列以从一个资源中读取会发生什么?当 CPU 轮流读取磁盘时,您最终会在每个块上闲置。GCD 对空闲 CPU 做出反应,增加线程池。在这种情况下,会导致线程过多甚至争用更多。
解决方案是使用 dispatch_io 函数进行读取,并在不同的并发队列上进行图像处理,该队列将根据需要自由增长。
dispatch_queue_t imageProcessing = dispatch_queue_create("com.yourReverseDomainHere", DISPATCH_QUEUE_CONCURRENT);
for (NSURL *url in ...){
dispatch_io_t io = dispatch_io_create_with_path(DISPATCH_IO_RANDOM,[[url path] fileSystemRepresentation], O_RDONLY, 0, NULL, NULL);
dispatch_io_set_low_water(io, SIZE_MAX);
dispatch_io_read(io, 0, SIZE_MAX, dispatch_get_main_queue(),^(bool done, dispatch_data_t data, int error){
// convert the file from dispatch_data_t to NSData
const void *buffer = NULL;
size_t size = 0;
dispatch_data_t tmpData = dispatch_data_create_map(data, &buffer, &size);
NSData *nsdata = [[NSData alloc] initWithBytes:buffer length:size];
dispatch_release(tmpData);
free(buffer);
// send this nsdata elsewhere for processing
dispatch_async(imageProcessing, ^{
// ...image processing code...
});
});
}
串行队列一次运行一个任务,因此每个串行队列一次只使用一个内核(尽管在任何时候使用哪个内核都没有定义并且可以更改)。