Почему этот код CATiledLayer / PDF работает медленно? - PullRequest
8 голосов
/ 09 августа 2010

Вот код:

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

Я взял образец кода WWDC 2010 PhotoScroller, который реализует вложенный UIScrollViews для масштабирования, внутри UIScrollView для пейджинга,и подкачал то, что я думал, будет минимальным количеством кода, необходимого для отображения многостраничного PDF вместо изображений.

Это работает.Но на моем iPhone4 это медленно, около трех секунд, чтобы нарисовать первую страницу, и еще медленнее на моем iPod Touch.Я могу наблюдать, как рисуют отдельные плитки.Этот же PDF-файл уже открывается быстрее, без видимого рисунка плитки, в альтернативной реализации CATiledLayer, которая у меня есть, которая просто использует один CATiledLayer / UIScrollView и сенсорные события для изменения страниц.Я бы хотел использовать эту технику PhotoScroller, это очень приятно.

Я наблюдал за ней с помощью CPU Sampler в Инструментах, и это не похоже на код рендеринга PDF, похоже, времязанялся потоками и обменом сообщениями.Я был бы признателен, если бы кто-то мог помочь указать, что этот пример делает, чтобы понести накладные расходы.

Спасибо,

Джим


Обновление 1: у меня былоПервоначально использовался метод класса TilingView из примера кода определения

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

И затем рисование в - (void)drawRect:(CGRect)rect, но переключился на явный подкласс CATiledLayer в качестве первой попытки увидеть, будет ли он делатьРазница, но это не так, и поэтому я оставил код как есть для размещения здесь.Также в TilingView отсутствует утечка [tiledLayer release];.

Ответы [ 3 ]

4 голосов
/ 28 октября 2010
2 голосов
/ 17 августа 2010

, поскольку ваш код содержит пару ошибок, и я не могу скомпилировать код, но я взглянул на файл PDF, который был включен в архив, и я знаю причину, по которой ваш TilingView работает медленно.

Обычно, когда вы рисуете страницу PDF в CGContext с использованием метода CGContextDrawPDFPage:, весь текст и векторная графика отображаются, а другие элементы, например обычная графика в PDF, просто рисуются и кэшируются. Таким образом, не имеет значения, насколько велик PDF-файл, но имеет значение, если у вас есть векторная графика в вашем PDF. Кажется, что у вас есть некоторая векторная графика в вашем PDF, а также математические уравнения, поэтому она медленная. Я предлагаю вам попробовать другой файл PDF, который не содержит векторной графики, и посмотреть, быстрее ли он.

Приветствия

Чжэн

1 голос
/ 17 сентября 2010

Гипотеза не должна приниматься никакими авторитетами: PDF - это векторный формат для большинства документов (исключая те, которые просто служат контейнером для встроенных изображений TIFF).Поэтому, когда вы разбиваете на листы PDF, как PhotoScroller, вы по существу просите телефон масштабировать и растеризовать весь PDF (по крайней мере, заданную страницу) для каждой отдельной плитки.Поэтому вместо того, чтобы рисовать его один раз, как для одного CATiledLayer, вы делаете это несколько раз для каждого разрешения.Поскольку PDF сам по себе является масштабируемым форматом, вы должны иметь возможность просто визуализировать весь вид по одному разу для каждой страницы / масштаба.

Обновление: Только что пройдя через это сам, PhotoScrollerобразец имеет некоторые логические проблемы, которые делают его очень медленным.По сути, он рендерит каждую плитку в 1 / zoomScale, затем масштабирование возвращается к zoomScale.Таким образом, если зум равен .5, он рендерится на 2x , а затем уменьшает его до 0,5x.Очень медленный и неэффективный.

...