8

コードは次のとおりです。

https://www.dropbox.com/s/o42wy36x4qhrbpt/PDFScroller.zip

ズーム用、ページング用のネストを実装するWWDC 2010PhotoScrollerサンプルコードを取得し、画像の代わりに複数ページのPDFを表示するために必要な最小限のコードと思われるものを交換しました。UIScrollViewsUIScrollView

できます。しかし、私のiPhone4では遅く、最初のページをペイントするのに約3秒かかり、iPodTouchではさらに遅くなります。個々のタイルをペイントしているのを見ることができます。この同じPDFは、タイルの描画が表示されずに、すでにより速く開きます。別のCATiledLayer実装では、単一のCATiledLayer/UIScrollViewおよびtouchイベントを使用してページを変更するだけです。このテクニックを使いたいPhotoScrollerのですが、とてもいいです。

InstrumentsのCPUSamplerで見ましたが、PDFレンダリングコードではないようです。スレッド化とメッセージングに時間がかかっているようです。このサンプルがオーバーヘッドを発生させるために何をしているのかを誰かが指摘するのを手伝ってくれれば幸いです。

ありがとう、

ジム


更新1:私はもともとTilingView定義のサンプルコードからのクラステクニックを使用していました

+ (Class) layerClass {
  return [CATiledLayer class];
}

そして、それが違いを生むかどうかを確認する最初の試みとして、描画しまし- (void)drawRect:(CGRect)rectたが、明示的なサブクラスに切り替えましたがCATiledLayer、そうではなかったので、ここに投稿するためにコードをそのままにしました。[tiledLayer release];TilingViewにもリークがありません。

4

3 に答える 3

5

iPhone / iPad / iOS用のこのスレッド高速で無駄のないPDFビューアを参照してください-ヒントとヒント?PDFレンダリングのヒント。

于 2010-10-27T20:19:23.337 に答える
2

コードにいくつかのエラーが含まれていて、コードをコンパイルできませんが、アーカイブに含まれているPDFファイルを調べたところ、TilingViewが遅い理由がわかりました。

CGContext通常、メソッド:を使用してPDFページを描画するCGContextDrawPDFPageと、すべてのテキストとベクターグラフィックがレンダリングされ、PDFの通常のグラフィックなどの他のものが描画されてキャッシュされます。したがって、PDFファイルの大きさは重要ではありませんが、PDFにベクトルグラフィックが含まれているかどうかは重要です。PDFにいくつかのベクトルグラフィックといくつかの数学方程式があるようです。それが遅い理由です。ベクターグラフィックを含まない別のPDFファイルを試して、より高速かどうかを確認することをお勧めします。

乾杯

于 2010-08-17T08:21:12.467 に答える
1

いかなる種類の権限も持たないという推測:PDF、ほとんどのドキュメント(埋め込みTIFF画像のコンテナとして機能するものを除く)のベクターベースの形式です。したがって、PhotoScrollerのようにPDFを並べて表示する場合は、基本的に、個々の並べ替えごとにPDF全体(少なくとも特定のページ)を拡大縮小してラスタライズするように電話に要求します。したがって、単一のCATiledLayerの場合のように一度ペイントするのではなく、解像度ごとに複数回ペイントします。PDFはそれ自体がスケーラブルな形式であるため、ページ/スケールごとにビュー全体を1回だけレンダリングできるはずです。

更新:これを自分で行ったばかりですが、PhotoScrollerサンプルには、非常に遅くなるロジックの問題がいくつかあります。基本的に、各タイルを1 /zoomScaleでレンダリングしてから、scalesをzoomScaleに戻します。したがって、ズームが.5の場合、2倍でレンダリングされ、0.5に縮小されます。非常に遅い非効率的。

于 2010-09-17T16:15:03.270 に答える