2012-05-13 21 views
1

CGContextDrawPDFPage()を使用してPDFページをレンダリングするときの、CATiledLayerの動作を理解しようとしています。CATiledLayerの基本:なぜCATiledLayerのdrawLayer:inContext:PDFをレンダリングするときに頻繁に呼び出されますか?

drawLayer:inContext:は、タイルと詳細のレベルごとに1回呼び出されていました。あれは正しいですか?私はCGContextDrawPDFPage(). 呼んで私のタイル張り層のデリゲートで

しかし、私は私が小さい私のタイル張り層のタイルサイズを作る場合drawLayer:inContext:がより頻繁に呼び出されること(drawLayer:inContext:にログを置くことによって)に気づきました。 これは私に不思議に思う:

  • 私のPDFページは描画/レンダリングされた回数ですか?
  • CGContextDrawPDFPage()は、描画するページの部分を魔法のように知っていますか?
  • CATiledLayerではPDFページをレンダリングする際にリソースが浪費されませんか?その利点は何ですか?

答えて

2

タイルレイヤーのタイルサイズを小さくすると、drawLayer:inContext:が頻繁に呼び出されることに気付きました。

はい、もちろんです。層のサイズが同じであると仮定すると、小さなタイルを使用するように指示すると、その領域をカバーするためにさらにタイルが必要になります。

私のPDFページは描かれている/ x回レンダリングされていますか?

CGContextDrawPDFPage()をタイルごとに1回呼び出すので、はいです。

しかし、それは、問題ではないかもしれない:魔法描画するページのどの部分を知っている

んCGContextDrawPDFPage()?

魔法は必要ありません。

CATiledLayerが-drawLayer:inContext:を呼び出す前に、そのタイルの領域のみを含むようにCGContextのクリップを設定します。 PDF描画コードは(CGContextGetClipBoundingBoxを介して)クリップ境界を取得し、その矩形内のコンテンツのみをレンダリングすることを選択できます。

前記二つの注意点があります

  1. CGContextDrawPDFPage()はブラックボックスなので、実際には、最適化を行うことではないかもしれません。それは明らかですが、実際に起こっているかどうかを確認するには、パフォーマンス数値を確認する必要があります。
  2. PDFコンテンツの解析とレイアウトにはかなりのオーバーヘッドがあります。あなたはまだCGContextDrawPDFPageへの各呼び出しでそのコストの一部を負う可能性があります - それは本当にスマートCGがどのように、そしてそれが内部的に物事をキャッシュするかどうかにかかっています。

PDFページをレンダリングするときにCATiledLayerリソースが無駄ですか?その利点は何ですか?

CATiledLayerの利点はほとんどがメモリ節約にあります。レンダリングされたコンテンツが格納されるビットマップは非常に大きいので、現在表示されているコンテンツのみをレンダリングして保持することができます。また、ユーザーがどのようにズームしてスクロールするかに応じて、最近表示された領域やすぐに再び表示される領域をキャッシュするメカニズムも提供します。

トレードオフは、図面をタイルごとに別々の呼び出しに分けなければならないため、そうでない場合よりも頻繁にタイルにレンダリングする必要があります。

ビューの大きさ、ズームイン/ズームアウトの距離、描画するPDFの高さ、アプリケーションで何が起きているかによって、CATiledLayerを使用するのが効果的かもしれません。パフォーマンスの数値を見て決定するのはあなた次第です。

+0

このトピックに関するいくつかの洞察をお寄せいただきありがとうございます。 AppleはいつかここでドキュメントとAPIを追加することを望んでいる。特にSafariでPDFを表示するときにテキスト選択をサポートできるように見えますが、APIは公開されていません。おそらくそれが来たら、ドキュメントはに更新されるでしょう。 – Krumelur

+0

このトピックでご覧になりたい追加のドキュメントがある場合は、バグを報告するか、または「このドキュメントでお手伝いしましたか?ボタンをWebベースのドキュメントに追加します。彼らはあなたの心を読むことができないので、あなたが失っていると思う文書について具体的にしてください。 –

+0

私はこの今日、https://developer.apple.com/library/ios/#samplecode/ZoomingPDFViewer/Introduction/Intro.htmlのサンプルコードを見て、TitledPDFViewのように見えます。スクロールビュー(間違っているのは、コンテキストの境界ボックスで表される領域にのみ塗りつぶす必要があります)を表示し、次にpdfページのどの部分を表示するかを言わずにCGContextDrawPDFPageを呼び出します。 CGContextDrawPDFPageがその領域をレンダリングするのに十分なほどスマートであるか、またはその領域を中心としたpdf全体を整えるかどうかまだ分かりません。 – mgrandi

1

Ogres ... AhemのPDFは玉ね状のようなものなので、 QuartzCoreはHeavily(PDFのレンダリング方法に基づいています)、CATiledLayerは繰り返し描画されるオブジェクトを指定する特定の "タイリング"レンダリングメソッドを使用しています。したがって、タイルが移動されたり更新されたりすると、レイヤーはより多くのデータを要求し、drawLayer:inContext:を1つ以上のバックグラウンドスレッドで呼び出します。

CATiledLayersもキャッシュを大量に使用し、可視レイヤーのみをロードするため、非常に効率的です。

関連する問題