"执行昂贵的无拆卸操作!" - 它是什么,以及如何解决它?

jam*_*ack 5 core-image ios ios5

我的Core Filters测试应用程序的调试控制台显示以下消息:

CGImageRef 0x7a0e890具有行字节填充.执行昂贵的卸载操作!

我无法在标题或Google搜索中找到该确切消息(减去指针信息)的匹配.

我的问题是(1)这意味着什么;(2)我如何纠正这种情况?

以下是我如何使用CIFilter生成过滤的UIImage的示例.

- (UIImage*)sepia
{    
    CIImage *beginImage = [CIImage imageWithCGImage:[self CGImage]];
    CIContext *context = [CIContext contextWithOptions:nil];

    CIFilter *filter = [CIFilter filterWithName:@"CISepiaTone" 
                                  keysAndValues: kCIInputImageKey, beginImage, 
                        @"inputIntensity", [NSNumber numberWithFloat:0.8], nil];
    CIImage *outputImage = [filter outputImage];

    CGImageRef cgimg = 
    [context createCGImage:outputImage fromRect:[outputImage extent]];
    UIImage *newImg = [UIImage imageWithCGImage:cgimg];

    self = newImg;

    CGImageRelease(cgimg);
    return self;
}
Run Code Online (Sandbox Code Playgroud)

Rob*_*ill 4

字节填充是添加到每个图像行末尾的额外字节,以确保每行在内存中以 2^n 字节倍数开始。这会以牺牲图像大小为代价来提高内存访问性能。如果将 CGImageGetBytesPerRow 的结果与根据图像尺寸和每像素字节计算出的每行预期字节进行比较,您可以检查这一点。

至于如何纠正取消填充 - 您需要准确找到哪个操作正在触发取消填充并从那里获取它。取消填充的成本很高,因为基本上需要对整个图像内存进行洗牌以消除所有行尾间隙。