首页 文章

如何使用CPU而不是GPU处理CIFilter?

提问于
浏览
3

有谁知道怎么告诉核心图像使用CPU而不是GPU通过CIFilter处理CIImage?我需要处理一些非常大的图像,并且使用GPU会得到奇怪的结果 . 我不关心CPU需要多长时间就可以了 .

3 回答

  • 0

    kCIContextUseSoftwareRenderer 在这里是关键:

    + (CIContext*)coreContextFor:(NSGraphicsContext *)context forceSoftware:(BOOL)forceSoftware
    {
        //CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);
        CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
        NSDictionary *contextOptions = [NSDictionary dictionaryWithObjectsAndKeys:
                                        (id)colorSpace, kCIContextWorkingColorSpace,
                                        (id)colorSpace, kCIContextOutputColorSpace,
                                        [NSNumber numberWithBool:forceSoftware], kCIContextUseSoftwareRenderer,
                                        nil];
        CIContext* result = [CIContext contextWithCGContext:(CGContext *)[context graphicsPort] options:contextOptions];
        CGColorSpaceRelease(colorSpace);
        return result;
    }
    

    在软件中渲染更多(CPU)解决了一些问题,但是......在现代机器上性能损失如此之大,我不能说它是解决方案 . 我在我的应用程序中使用CoreImage,我总是在屏幕上使用GPU进行渲染,而强制CPU仅用于保存 . 我注意到CPU渲染在我的测试硬件上更准确一些,保存过滤后的图像是一个漫长的过程,我可以在这里牺牲速度 .

  • 3

    不是答案,但你总是可以重新编写CIkernel作为对像素RGB值进行操作的函数,然后将该函数应用于图像数据的循环中,并将结果转换为CIImage .

  • 0

    这是一个Swift版本:

    func coreContextFor(context : CGContext,forceSoftware force : Bool) -> CIContext {
        let colorSpace = CGColorSpaceCreateDeviceRGB()
        let options : [String:AnyObject] = [
            kCIContextWorkingColorSpace: colorSpace!,
            kCIContextOutputColorSpace : colorSpace!,
            kCIContextUseSoftwareRenderer : NSNumber(bool: force)
        ]
    
        return CIContext(CGContext: context, options: options)
    }
    

相关问题