30 種類の画像をレンダリングしたい。各タスクは、異なる画像レイヤーを 1 つの最終画像 (30 枚の最終画像) にマージする必要があります。
現在、GCD シリアル キューを使用しています。このアプローチが利用可能なすべてのコアの CPU パワーを自動的に使用するかどうかを知りたいですか?
または、代わりに GCD 同時キューを使用すると、これらすべてのタスクのレンダリング時間を改善できますか? 明確にしてくれてありがとう..
30 種類の画像をレンダリングしたい。各タスクは、異なる画像レイヤーを 1 つの最終画像 (30 枚の最終画像) にマージする必要があります。
現在、GCD シリアル キューを使用しています。このアプローチが利用可能なすべてのコアの CPU パワーを自動的に使用するかどうかを知りたいですか?
または、代わりに GCD 同時キューを使用すると、これらすべてのタスクのレンダリング時間を改善できますか? 明確にしてくれてありがとう..
シリアル キュー = 1 タスク = 1 コア。しかし、ユースケースの本当の問題は I/O 競合です。1 つのリソースから読み取るために同時キューを生成するとどうなりますか? ディスクを順番に読み取っている間、各ブロックで 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...
});
});
}