1

「drawRect」メソッドを改善する必要があります。とても遅いです。さまざまなブレンドモードでマージしたい透明なpngが10個あります。AppleDeveloperLibStackoverflowからの投稿を読みました。

ここで、コードと全体的な描画パフォーマンスを改善する方法を知りたいです。手伝っていただけませんか?これらすべての画像をforループ内にロードすると、非常に遅くなりますよね?どうすれば最高のパフォーマンスを得ることができますか?

  - (void)drawRect:(CGRect)rect {

        CGContextRef context = UIGraphicsGetCurrentContext();
        CGAffineTransform matrix =CGContextGetCTM(context);
        CGAffineTransformInvert(matrix);
        CGContextConcatCTM(context,matrix);

            CGRect contentRect;

             // load each UIImage
        for (i=0; i< [configurationArray count]; i = i + 1) {   
                    image = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:imageName ofType:nil]];

    contentRect = CGRectMake(x,y,image.size.width,image.size.height);
    CGContextSetBlendMode (context, kCGBlendModeScreen);
    CGContextSetAlpha (context, [layerData.layerAlpha floatValue]);


    CGContextDrawImage (context,contentRect, image.CGImage);

    }
}

アップデート:

現在、CALayersを使用して、ピクセルを必要な位置に直接配置しています。ただし、レイヤーごとに異なるブレンドモード、アルファおよびカラーフィルが必要です。各レイヤーで高価な「CGContextDrawImage」メソッドを呼び出さないようにする方法はありますか?たとえば、特定のレイヤーの小さいサイズのコンテキストを更新できることを願っていますよね?または、コンテキストの変更ごとにUIView全体をレンダリングする必要がありますか?

誰かが私を正しい方向に押してくれることを願っています。私はそのトピックについて学ぶ必要があります。助けてくれてありがとう。

- (void)drawRect:(CGRect)rect {
 // load each UIImage
        for (int i=0; i< [myArray count]; i++) { 

        image = [[ImageCache sharedImageCache] imageForKey:imageName];

       CALayer* sublayer = [CALayer layer] ;

        [sublayer setPosition:CGPointMake(image.size.width/2, image.size.height/2)]; 
        [sublayer setFrame:CGRectMake(x, y, image.size.width, image.size.height)];

        CGImageRef layerImage = [image CGImage];
        [sublayer setContents:(__bridge id) layerImage];
        [sublayer setBackgroundColor:[[UIColor clearColor] CGColor]];
        [self.layer addSublayer:sublayer];

// How can i set the blend mode, color fill & alpha value without 
// calling the expensive "CGContextDrawImage" ? Possible?

}
}
4

1 に答える 1

0

ブラッドのコメントによると:

おそらく、-drawRect:内に10枚の画像をロードするべきではありません。最初にそれらを別の場所にロードしてキャッシュします。ただし、その数の画像でのメモリ使用量には注意してください。

ブラッドのアプローチで終わりました。

于 2012-07-30T12:58:05.073 に答える