タイルレイヤーのタイルサイズを小さくすると、drawLayer:inContext:
が頻繁に呼び出されることに気付きました。
はい、もちろんです。層のサイズが同じであると仮定すると、小さなタイルを使用するように指示すると、その領域をカバーするためにさらにタイルが必要になります。
私のPDFページは描かれている/ x回レンダリングされていますか?
CGContextDrawPDFPage()をタイルごとに1回呼び出すので、はいです。
しかし、それは、問題ではないかもしれない:魔法描画するページのどの部分を知っている
んCGContextDrawPDFPage()?
魔法は必要ありません。
CATiledLayerが-drawLayer:inContext:
を呼び出す前に、そのタイルの領域のみを含むようにCGContextのクリップを設定します。 PDF描画コードは(CGContextGetClipBoundingBox
を介して)クリップ境界を取得し、その矩形内のコンテンツのみをレンダリングすることを選択できます。
前記二つの注意点があります
CGContextDrawPDFPage()
はブラックボックスなので、実際には、最適化を行うことではないかもしれません。それは明らかですが、実際に起こっているかどうかを確認するには、パフォーマンス数値を確認する必要があります。
- PDFコンテンツの解析とレイアウトにはかなりのオーバーヘッドがあります。あなたはまだ
CGContextDrawPDFPage
への各呼び出しでそのコストの一部を負う可能性があります - それは本当にスマートCGがどのように、そしてそれが内部的に物事をキャッシュするかどうかにかかっています。
PDFページをレンダリングするときにCATiledLayerリソースが無駄ですか?その利点は何ですか?
CATiledLayerの利点はほとんどがメモリ節約にあります。レンダリングされたコンテンツが格納されるビットマップは非常に大きいので、現在表示されているコンテンツのみをレンダリングして保持することができます。また、ユーザーがどのようにズームしてスクロールするかに応じて、最近表示された領域やすぐに再び表示される領域をキャッシュするメカニズムも提供します。
トレードオフは、図面をタイルごとに別々の呼び出しに分けなければならないため、そうでない場合よりも頻繁にタイルにレンダリングする必要があります。
ビューの大きさ、ズームイン/ズームアウトの距離、描画するPDFの高さ、アプリケーションで何が起きているかによって、CATiledLayerを使用するのが効果的かもしれません。パフォーマンスの数値を見て決定するのはあなた次第です。
このトピックに関するいくつかの洞察をお寄せいただきありがとうございます。 AppleはいつかここでドキュメントとAPIを追加することを望んでいる。特にSafariでPDFを表示するときにテキスト選択をサポートできるように見えますが、APIは公開されていません。おそらくそれが来たら、ドキュメントはに更新されるでしょう。 – Krumelur
このトピックでご覧になりたい追加のドキュメントがある場合は、バグを報告するか、または「このドキュメントでお手伝いしましたか?ボタンをWebベースのドキュメントに追加します。彼らはあなたの心を読むことができないので、あなたが失っていると思う文書について具体的にしてください。 –
私はこの今日、https://developer.apple.com/library/ios/#samplecode/ZoomingPDFViewer/Introduction/Intro.htmlのサンプルコードを見て、TitledPDFViewのように見えます。スクロールビュー(間違っているのは、コンテキストの境界ボックスで表される領域にのみ塗りつぶす必要があります)を表示し、次にpdfページのどの部分を表示するかを言わずにCGContextDrawPDFPageを呼び出します。 CGContextDrawPDFPageがその領域をレンダリングするのに十分なほどスマートであるか、またはその領域を中心としたpdf全体を整えるかどうかまだ分かりません。 – mgrandi