0

3つ以上のUIImageを描画/マージするためにGCContextを使用すると、なぜこれほど多くのメモリを使用するのか理解できません。ARCを有効にしていて、Instrumentsでプログラムのメモリ使用量を確認すると(VM Trackerツールを使用)、以下の最初のソリューションでは、CGContextで描画しているのに対し、2つの画像(約16MBDirtySizeと80MBResidentSize)のメモリのみを使用していることがわかります。すべてのUIImageのメモリ量(約468MBDirtySizeと520MBResidentSize)を使用し、最終的にアプリがクラッシュします。CGContextが2つのUIImageに使用されるメモリの量を超えて使用しないようにするにはどうすればよいですか?実際、私は、最小限のメモリ要件と最適なパフォーマンスで、同じサイズの画像ファイル(.PNGベースで、すでに透過的な設定があります)の複数のレイヤーを描画するための一種のダブルバッファリングを実現したいと思っています。

私のViewControllerには「UIImageView*imageView」プロパティと「CGSizeimageSize」プロパティが含まれていることに注意してください。

次のコードは、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;
}

上記は本当に私を狂わせます、そして誰かが私が欠けているものをここで見ますか、または最大のパフォーマンスと最小のメモリ使用量を得るために何をすべきか知っていますか?!

4

1 に答える 1

1

進むべき道は CATiledLayer を使用することであり、必要に応じて画像データをさまざまな縮尺サイズでタイル化することであることがわかりました。Apple のサンプル コードを掘り下げて StackOverflow を検索すると、この問題を解決するのに役立ちました。

于 2013-03-27T15:26:08.127 に答える