2012-02-06 8 views
0

私はCGContextを使用していますが遅いCGContext:まず、UIBezierPathsで描く、背景画像を描画し、コンテキストを作成し、コンテキストを解放&画像を取得します。第二に、このような別のもので、この画像を結合:二段階でiOS5を

UIGraphicsBeginImageContextWithOptions(self.anchorImage.size, NO, 1); 
[self.anchorImage drawInRect:CGRectMake(0, 0, self.anchorImage.size.width, self.anchorImage.size.height)]; 
[tempImage drawInRect:CGRectMake(0, 0, self.anchorImage.size.width, self.anchorImage.size.height)]; 
UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

これはiOS4をしてうまく、しかし、それは(私は3GSでテストしています)iOS5を中に非常に非常に遅いです。私は何か間違っているのですか?あるいはこれを行うためのより最適な方法がありますか?それとも特定のiOS5の方法がありますか?

+0

あなたが最初のコンテキストを閉じ、そしてちょうど 'UIBezierPaths'下/上の第1のコンテキストで第2の画像を描画していない理由はありますか? –

答えて

2

あなただけの画像を生成する、またはビューに描画されているかどうかは私にははっきりしていません。とにかく、スピードを向上させるために、これらのイメージの生成を別のディスパッチキューにオフロードすることができるので、現在のスレッド(おそらくメインスレッド?)はブロックされません。

UIGraphics*の代わりに、CGBitmapContextCreateCGBitmapContextCreateImageを組み合わせて使用​​します。最終的な画像が生成されたら、画像ビューを更新します(または、画像で何をしたいかを行います)。

dispatch_async(your_async_queue, ^() { 
    CGContextRef ctx = CGBitmapContextCreate(/* params */); 

    // your drawing 

    CGImageRef imageRef = CGBitmapContextCreateImage(context); 
    UIImage * image = [[UIImage alloc] initWithCGImage:imageRef]; 
    CGImageRelease(imageRef); 
    CGContextRelease(context); 

    dispatch_async(dispatch_get_main_queue(), ^() { 
     // do something with image on the main thread 
    }); 
} 

完全なシグネチャについては、CGBitmapContext documentationを参照してください。