2011-02-10 12 views
5

iPad用PDFリーダーの開発では、レンダリングが集中するページ(多くのパスが含まれています)の高解像度画像を用意し、pdfページの代わりにそれらを使用して、 3*768 by 3*1024は、可読性とレンダリングパフォーマンスの間に良い妥協点があると判断し、〜1.5 MB jpegsという結果になりました。なぜUIImageViewはCGContextDrawImageに比べてメモリが大量になっているのですか

ただし、画像ページを表示するための2つの実装をテストしました。サブクラス「」を使用するサブクラスで、「通常の」PDFページ(図面はCGContextDrawImage)を扱います。もう1つはUIImageViewを使用します。後者は、表示とズームが非常に速いという利点がありますが、メモリ使用量は実際には悪いです。メモリには 30 MB(画像のビットマップサイズと一致します)が必要です。もう1つのアプローチ(CATiledLayer)は、最初にページを表示するにはもっと時間が必要で、ズーム後に再レンダリングするにはもう2秒必要です(pdfページに似ていますが、はるかに高速です)。しかし、画像またはPDFページ。

バックグラウンドで何が起こっているのか誰でも知っていますか?CGContextDrawImageのメモリ使用量が低い場合は、Quartz Frameworkを使用してUIImageViewの高性能を組み合わせることは可能でしょうか。

答えて

3

ないこの質問はまだ関連ですが、もしそうなら、多分これが役立つかどうかわから:

私も私のtiled image viewに大きな意見の効率的な表示の戦いを戦ってきました。問題の根本的な部分の束があります。

  • 通常UIViewは、UIImageView含め、常に完全にその画像のためのメモリに裏打ちされているように見えます。 drawRect:メソッドを実装しても、スクロールビュー内に表示される領域だけでなく、常にビューの境界全体を渡すように見えます。あなたが発見したように、これはすぐにロットのメモリを各ピクセルが4バイトかかります。
  • CATiledLayerは目に見えるタイルの内容のみを要求します。それはもはや目に見えないタイルを捨てます。これがメモリ節約の原因です。ただし、通知と描画をバックグラウンドスレッドで行い、白からコンテンツにアニメートします。それはプライベートAPIを介してこれを行うようですが、CATiledLayerの機能を私自身のサブクラスCALayerとして再実装する方法は見つけられませんでした。単純な人物として使用できる通知メカニズムがないようです。
  • スクロールビュー内に複数のビューがある場合、それらはページングされるときにdrawRect:メッセージを適切に受信します。ただし、UIKitはビューの下にある非常に多くのサブビューでは苦労しているようです。あなたのために

、私は可能なオプションのカップルを見ることができます:

  • CATiledLayerベースの実装を回収できる可能性があります。 fadeDurationのデフォルトは0.25秒です。これは、読み込み時間が短い場合には長すぎる可能性があります。この権利を1.0/60.0のようなもの、つまり1つのフレームにドロップすることができます。あなたの説明からはっきりしないことの1つは、画像がページサイズ全体をカバーするのか、それとも256x256ピクセルのタイルだけをカバーするのかです。各タイルについてJPEG全体を繰り返しデコードすることは、個々のタイルファイルをデコードするよりもはるかに遅くなります。
  • CATiledLayerスレッドからのすべての処理の遅延が大きすぎる場合は、スクロールビューのメインサブビューであるUIViewという空白に、サブビューとしてUIImageViewサブビューを手動で作成できます。これらの各サブビューには、それぞれ独自のタイルイメージが割り当てられます。あなたが運が良ければ、UIKitはこれらのビューの内容を削除し、必要に応じて対応するJPEGを再ロードするほどスマートになります。
  • UIImageViewsが十分にスマートでないか、またはUIKitが対処するビューが多すぎる場合、JPEGをロードする独自のビューを構築することができます。drawRect:まだあまりにもぎこちなかった場合は、自分のCALayersを試してください。これは、単一のビューのブランクレイヤのサブレイヤになり、必要に応じてイメージを再度ロードします。これは私が最終的に私のタイル画像ビューのために行ったものです。

これはスクロールを対象としていますが、ユーザーがズームアウト(縮小)できるようにすると、それでもなお遅くなる可能性があります。その場合は、適切な低解像度バージョンを保存し、それらの最も外側のズームレベルのものをロード/表示することをお勧めします。

+0

この詳細で啓発的な回答をいただきありがとうございます。私が実際にこれを求めているプロジェクトは完了していますが、あなたの説明が今後の課題に役立つと確信しています。 –

関連する問題