2012-01-12 11 views
1

私がやっていることは、2つのイメージを1つのイメージにマージすることです。drawInRectのパフォーマンスが遅すぎる

ここにコードがあります。

UIGraphicsBeginImageContext(CGSizeMake(1024, 768)); 

[image1 drawInRect:CGRectMake(0, 0, 512, 768)]; 
[image2 drawInRect:CGRectMake(512, 0, 512, 768)]; 
UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

しかし、drawInRectが遅すぎるようです。

イメージをマージする方法はありますか?

+0

なぜ2つの画像を結合しようとしていますか?そして「遅すぎる」とはどういう意味ですか?あなたは良い数のピクセルの周りを押しています。 –

+0

イメージをマージする最速の方法は、イメージをマージする必要がないときにマージするのを避けることです。たとえば、マージ前のイメージの1つが変更されるまで、マージして結果をキャッシュし、その後イメージを再利用することができます。 – dasblinkenlight

+0

@KevinBallard私はそれが必要なので。 – Umgre

答えて

3

オプション0 - 描画する必要があるときだけ描画し、描く必要がある場合のみ描画します。あなたが先のサイズを知っている場合


オプション1

(おそらくself.frame.size?)、あなたは先のサイズ回避補間に2枚のソース画像(平ら)から一つの画像を作成することができます。だから、その可能性:

  1. あなたは(あなたはそれが良い見てみたい場合は高いCPU)あなたは
  2. 避け補間を引き出さなければならないイメージの数を減らして
  3. を必要とするメモリを減らして
  4. 良く見ては - コンポジット高品質補間を使用できます。

もちろん、これは、コンポジットが描かれなければならないよりも低い周波数で変化する場合にのみ当てはまります。あなたは2枚の画像をしたいとあなたはそれらのサイズがちょうど(あなたがそれらを拡大している場合だけでなく、あなたのメモリ使用量を監視)彼らはで描画されなければならないサイズにそれらのサイズを変更し、変更しないことを知っている場合であっても

はオプション2

はオプション3

それはオプションではない場合、あなたはCGContextの状態を変更し、補間の品質を低下させる可能性があります。同様のCALayer変換に慣れていれば、低品質か補間なしで満足できるでしょう。

+1

OPが質問を編集しましたか?これは別の問題に答えるようです(補間はどこに入りますか?)。私はちょうど、iOS drawInRectが非常に遅いことを発見する問題に遭遇しました。(イメージピクセルをピクセル単位で描画し、ディスクに保存し、ディスクから新しいファイルとして再ロードします。 drawInRect:それは気違いです) – Adam

+0

@Adamいいえ、質問は編集されませんでした。多くの色の補間は、ストレッチ/リサイズ時に使用されるものです。要は、リサイズには時間がかかりますが、リサイズのスピードを避けて最小化するための品質オプションと方法があります。 – justin

1

あなたができることの1つは、-drawRect:を実装するのではなく、2つの画像を内容として持つ2つのCALayersを持っていて、もう一方を前に置くことです。それが速くなるかどうかはわかりませんが、CAが描画を非同期的にGPUで処理できるようになる可能性は高いと思います。

関連する問題