合并两个以上的图像会占用太多内存,为什么?

时间:2012-10-13 19:03:40

标签: uiimage instruments cgcontext

我无法弄清楚为什么使用GCContext绘制/合并两个以上的UII图像,使用它 很多记忆。我启用了ARC,在查看我的程序内存使用情况时(使用VM Tracker工具)我看到下面的第一个解决方案仅使用两个映像的内存(大约16 MB DirtySize和80 MB ResidentSize),而绘制CGContext使用我所有UIImages的内存量(约468 MB DirtySize和520 MB ResidentSize)最终导致我的应用程序崩溃。 如何确保CGContext的使用量不超过用于的内存量 两个UIImages? 实际上,我喜欢完成一种双缓冲,用于绘制具有最小内存要求和最佳性能的相同大小的图像文件(基于.PNG并且已经具有透明设置)的多个层。

请注意,我的ViewController包含'UIImageView * imageView'和'CGSize imageSize' 属性。

以下代码仅用于检查加载UIImages所消耗的内存量:

- (void)drawUsingTwoUIImages1:(NSMutableArray *)imageFiles
{
    if ( ! imageFiles.count ) {
        return;
    }
    NSString *imageFile1 = [imageFiles objectAtIndex:0];
    NSString *filePath1 = [[NSBundle mainBundle] pathForResource:imageFile1 ofType:nil];
    UIImage *image1 = [UIImage imageWithContentsOfFile:filePath1];
    UIImage *image2 = nil;
    image1 = [UIImage imageWithContentsOfFile:filePath1];
    for (NSInteger index = 1; index < imageFiles.count; index++) {
        NSString *imageFile2 = [imageFiles objectAtIndex:index];
        NSString *filePath2 = [[NSBundle mainBundle] pathForResource:imageFile2 ofType:nil];
        image2 = [UIImage imageWithContentsOfFile:filePath2];
    }
}

下一个代码我想在我的最终应用程序中使用,以显示所有绘制的imageFiles。我怀疑一些聪明的技巧需要按照CGContext处理的顺序进行,或者可能是CGLayerRef。如果有人能告诉我如何做到这一点,或想出工作 我将再次编码避难所了!

- (void)drawUsingTwoUIImages2:(NSMutableArray *)imageFiles
{
    _imageView.image = nil;
    if ( ! imageFiles.count ) {
        return;
    }
    NSString *imageFile1 = [imageFiles objectAtIndex:0];
    NSString *filePath1 = [[NSBundle mainBundle] pathForResource:imageFile1 ofType:nil];
    UIImage *image1 = [UIImage imageWithContentsOfFile:filePath1];
    UIImage *image2 = nil;
    for (NSInteger index = 1; index < imageFiles.count; index++) {
        if ( ! UIGraphicsGetCurrentContext() ) {
            UIGraphicsBeginImageContext(_imageSize);
        }
        NSString *imageFile2 = [imageFiles objectAtIndex:index];
        NSString *filePath2 = [[NSBundle mainBundle] pathForResource:imageFile2 ofType:nil];
        image2 = [UIImage imageWithContentsOfFile:filePath2];
        [image1 drawAtPoint:CGPointMake(0., 0.)];
        [image2 drawAtPoint:CGPointMake(0., 0.)];
        image1 = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    }
    _imageView.image = image1;
}

以上真的让我疯狂,有没有人在这里看到我缺少的东西,或者知道如何才能获得最大的性能和最少的内存使用量?!

1 个答案:

答案 0 :(得分:1)

我已经知道要走的路是使用CATiledLayer,并且需要在不同的比例尺寸中平铺你的图像数据。在Apple的示例代码中挖掘并在StackOverflow中搜索帮助我解决了这个问题。