#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
Все отображается с использованием 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 не реализуются.