2010-12-12 16 views
2

UIImageViewで一連のPNGを使用して達成したいアニメーションがいくつかあるとします。 アニメーションに多数のイメージがある場合、メモリ内のすべてのイメージをロードするので、メッセージが送信されてから遅れがあります。[myImgView startAnimation] 読み込みが遅延していることに気付きました。startAnimationメッセージが送信されない限り、イメージはメモリに読み込まれません。 遅延の問題を回避するには、アプリケーションデリゲートのすべてのアニメーションを読み込み、サブビューとしてアタッチし、アニメーションを1回しないようにします。私は最高の解決策が何であるかを理解したいですか?私の実際の解決策がドループを持っていれば?iOS上にアセットをあらかじめロードする

答えて

1

あなたは遅延ロードについて正しくあります。私は決してディスクからの怠惰なスプーリングか怠惰な減圧かどうかを判断することはできませんでしたが、UIImage(とその下のCGImage)は必ずしも完全に処理されず、実際に使用されるまで描く準備ができていません。 Appleがメモリ警告を内部的にどのように処理するかによって、未来になると考えられます。

CoreGraphicsを使用してバックグラウンドでイメージを展開し、startAnimationで読み込みが完了していない場合にのみ読み込みを終了するのが最適なソリューションだと思います。 UIKitオブジェクトは、メインスレッド以外のどこでも呼び出すことができないため、直接行うことはできません。 CGImageを取得し、ビットマップコンテキストに描画し、ビットマップコンテキストからイメージを作成し、UIImageにラップするためにメインスレッドにポストする必要があります。そして、おそらくNSOperationQueueを使用して操作の完全なリストを整理することは賢明でしょう。

すべてのPNGをロードしている間にメモリの警告を正しく処理している間に、ブロッキングの追加起動コストが気にならないとすれば、現在の方法に問題はないはずです。高レベルのObjective-Cに残ったまま、

+0

PNG圧縮解除は、アルゴリズム自体の複雑さのために、(比較的)スピードが非常に遅いという問題もあります。通常、JPEG画像は読み込みが高速ですが、必ずしも理想的ではありません。画像データをプリロードすることができる限り、オンザフライで解凍することによるヒットを回避することができる。 –

+0

これは、代わりの解決法を示唆しています:PNGを絶対最小圧縮でエンコードします。これは、すべてのスキャンラインとraw/literalセクションとして格納されたすべてのdeflateブロックに対してフィルタ0(予測なし)と思われます。その程度まで出力を微調整できるソフトウェアは認識していませんが、XcodeがPNGでいくつかの追加処理を行っていることを知っていますので、基本的に非圧縮のPNGを正しくバンドル。 – Tommy

関連する問題