Почему drawRect прокручивается медленнее, чем UIImageView для больших изображений в пользовательской UITableViewCell

#iphone #uitableview #quartz-graphics #drawrect

#iPhone #uitableview #quartz-графика #drawrect

Вопрос:

У меня есть пользовательская UITableViewCell, смоделированная точно по пользовательским руководствам UITableViewCell, найденным здесь — http://developer.apple.com/library/ios/#samplecode/AdvancedTableViewCells/Introduction/Intro.html#//apple_ref/doc/uid/DTS40009111

и здесь — http://developer.apple.com/library/ios/#samplecode/TableViewSuite/Introduction/Intro.html#//apple_ref/doc/uid/DTS40007318

Все отображается с использованием drawRect, а скорость прокрутки составляет 55 кадров в секунду при рисовании 3 строк и 1 изображения. Изображение рисуется с помощью —

 [self.sampleImage drawInRect:CGRectMake(0, 0, 55, 55)];
  

Как ни странно, скорость прокрутки снижается до 25 кадров в секунду, когда я визуализирую то же изображение, но в большей области

 [self.sampleImage drawInRect:CGRectMake(0, 0, 320, 80)];
  

Я экспериментировал с большими изображениями в drawRect в примере кода Apple, и, конечно же, частота кадров падает до 25 кадров в секунду.

Загвоздка в том, что частота кадров в секунду возвращается к 55, когда я рисую строки и отображаю изображение через UIImageVew.

  • Как можно рисовать большие изображения с помощью drawRect в UITableViewCell при сохранении скорости прокрутки 50 кадров в секунду?

  • Может ли UIImageView когда-либо быть быстрее, чем рисование изображения в drawRect (для UITableViewCell)?

  • Задействованы ли какие-либо силы GPU против CPU?

Ответ №1:

drawRect будет использовать core graphics для вывода изображения на экран, где он использует центральный процессор. если вы используете UIImageView, он будет использовать графический процессор, следовательно, это быстрее.

Решение состоит в том, чтобы не использовать drawRect.

Если вам абсолютно необходимо использовать drawRect, то вам может потребоваться нарисовать его, прежде чем прокручивать в какое-либо местоположение кэша / кэшировать чертеж и использовать это изображение для UIImageView.

Комментарии:

1. Интересно, но тогда почему каждый документ разработчика, включая собственный образец Apple, рекомендует drawRect? Это только для изображений меньшего размера?

2. Я думаю, это зависит от того, что вы рисуете. Например, если у вас сложная ячейка с несколькими текстовыми метками, может (на более старом оборудовании?) быстрее нарисовать их внутри одной -drawRect , чем внутри ячейки с несколькими UILabel символами. HTH.

Ответ №2:

У @darcwader это в значительной степени верно. Я думаю, причина, по которой во всех примерах используется drawRect, заключается в том, что изначально это дороже (для настройки ячеек), но впоследствии их анимация намного дешевле. Однако для больших изображений их рисование будет значительно дороже, и если вы прокручиваете несколько из них, преимущества использования drawRect не реализуются.