2011-07-15 16 views
5

私がアニメーション化する一連の画像を持っている(UIImageViewは、いくつかの基本的なアニメーションをサポートしていますが、それは私のニーズには十分ではありません)。のiOS:描画の速度を改善することは

私の最初のアプローチは、UIImageViewを使用し、画像にimageプロパティを設定しました。これは遅すぎた。速度が遅い理由は、画像を描いたことによるものでした(私には驚きました;私はボトルネックが画像をロードしていると仮定しました)。

私の第2のアプローチは、汎用UIViewを使用し、view.layer.contents = image.CGImageと設定しました。これは目立った改善をもたらさなかった。これらのアプローチの

はどちらもメインスレッドで実行する必要があります。私は遅い速度は画像データをCGContextに描かなければならないことによると思います。

どのようにして描画速度を向上させることができますか?背景スレッドのコンテキストに描画することは可能ですか?

答えて

0

UIImageViewの組み込みアニメーションサービスをUIImages *(animationImages)の配列を使用して作成し、animationDurationとanimationRepeatCountを伴って動作させないアニメーション要件についてはどうですか?

あなたが急速に複数の画像を描画している場合は、クォーツ2Dをよく見ます。あなたが描画していて、イメージをアニメーション化(移動、ズームなど)する場合は、Core Animationを見ているべきです。それは、クォーツ、2Dのような音

は、あなたが望むものです。ここでは、アップルのドキュメント: http://developer.apple.com/library/ios/#documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/Introduction/Introduction.html

+0

私はアニメーションシーケンスをより詳細に制御する必要があるため、 'UIImageView'は十分ではありません。例えば、フレーム1〜10をループし、次にフレーム11〜20を再生し、次にフレーム21〜30をループする。 –

+0

これらをそれぞれ別々のUIImageViewsに分割してみませんか? –

9

私はいくつかやってパフォーマンスを改善するために管理:PNGファイルはiOSの最適化されていたように

  • は、私は私のビルドプロセスを修正しました。 (アプリケーション用のコンテンツは、バンドルを出力する別のプロジェクトで管理されている。デフォルトバンドル設定PNG画像を最適化しない、OS Xバンドルのためのものです)。バックグラウンドスレッドで

  • I:

    1. ビットマップコンテキストからCGImageRefを作成したビットマップコンテキスト
    2. に新しいビットマップのコンテキスト(以下コード)
    3. ドリューPNG画像を作成
    4. layer.content

  • CGImageRefへのメインスレッド上での設定操作を管理するために NSOperationQueueを使用しました。

私はこれを行うには良い方法があります確信しているが、許容できる性能が上記の結果。

-(CGImageRef)newCGImageRenderedInBitmapContext //this is a category on UIImage 
{ 
    //bitmap context properties 
    CGSize size = self.size; 
    NSUInteger bytesPerPixel = 4; 
    NSUInteger bytesPerRow = bytesPerPixel * size.width; 
    NSUInteger bitsPerComponent = 8; 

    //create bitmap context 
    unsigned char *rawData = malloc(size.height * size.width * 4); 
    memset(rawData, 0, size.height * size.width * 4);  
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();  
    CGContextRef context = CGBitmapContextCreate(rawData, size.width, size.height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 

    //draw image into bitmap context 
    CGContextDrawImage(context, CGRectMake(0, 0, size.width, size.height), self.CGImage); 
    CGImageRef renderedImage = CGBitmapContextCreateImage(context); 

    //tidy up 
    CGColorSpaceRelease(colorSpace);  
    CGContextRelease(context); 
    free(rawData); 

    //done! 
    //Note that we're not returning an autoreleased ref and that the method name reflects this by using 'new' as a prefix 
    return renderedImage; 
} 
+1

最初の引数としてCGBitmapContextCreateにnullを渡すことができます。それはあなたのためのメモリ処理を処理します。また、mallocの戻り値を常にチェックして、失敗する可能性があるかどうかを確認する必要があります。 –

関連する問題