我正在尝试以最高效的方式运行一些核心图像滤镜。当渲染大型图像时,我会遇到内存警告和崩溃问题。我在查看苹果的《Core Image编程指南》。关于多线程,它说:“每个线程必须创建自己的CIFilter对象。否则,你的应用程序可能会出现意外行为。”
这是什么意思?
事实上,我正在尝试在后台线程上运行我的滤镜,以便我可以在主线程上运行一个HUD(请参见下文)。在CoreImage的背景下,这是否有意义?我了解到Core Image本质上使用GCD。
这是什么意思?
事实上,我正在尝试在后台线程上运行我的滤镜,以便我可以在主线程上运行一个HUD(请参见下文)。在CoreImage的背景下,这是否有意义?我了解到Core Image本质上使用GCD。
//start HUD code here, on main thread
// Get a concurrent queue form the system
dispatch_queue_t concurrentQueue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(concurrentQueue, ^{
//Effect image using Core Image filter chain on a background thread
dispatch_async(dispatch_get_main_queue(), ^{
//dismiss HUD and add fitered image to imageView in main thread
});
});
更多 Apple 文档内容:
保证线程安全
CIContext 和 CIImage 对象是不可变的,这意味着每个对象都可以在线程之间安全地共享。多个线程可以使用相同的 GPU 或 CPU CIContext 对象来渲染 CIImage 对象。然而,对于 CIFilter 对象情况并非如此,它们是可变的。CIFilter 对象不能在线程之间安全地共享。如果您的应用程序是多线程的,每个线程必须创建自己的 CIFilter 对象。否则,您的应用程序可能会表现出意料之外的行为。