Является ли drawrect более эффективным для рисования coregraphcs, чем использование основной графики в перемещении касаний? - PullRequest
1 голос
/ 01 октября 2011

Мое целое приложение использует touchesMoved для рисования (Coregraphics). Должен ли я звонить [self setNeedsDisplay] из touchesMoved вместо выполнения там кода рисования? Это остановит некоторое отставание, которое я испытываю? Единственная причина, по которой я не пытался сделать это до публикации, состоит в том, что мне потребуется несколько часов, чтобы преобразовать весь рисунок в drawRect, и я хотел знать, будет ли это более эффективным, чем рисование в touchesMoved?

Ответы [ 2 ]

3 голосов
/ 01 октября 2011

Да.Вы всегда должны держать свой чертеж в drawRect и использовать setNeedsDisplay, чтобы вызвать фактический рисунок.Это ключ к визуализации представлений в Cocoa Touch.

Например, если вы не использовали этот метод, потенциально вы могли бы разбросать код рисования по вашему классу в нескольких методах.Кроме того, это также гарантирует, что ваш код рисования выполняется только один раз за цикл рендеринга.По сути, вызов setNeedsDisplay вызывает флаг аннулирования, который позволяет вашему UIView узнать, как перерисовать себя.Без этого вы могли бы выполнять дополнительные операции рисования, которые фактически не нужны из-за цикла рендеринга.

1 голос
/ 02 октября 2011

Вы не должны рисовать внутри обратного вызова пользовательского интерфейса.Это замедлит или остановит отзывчивость пользовательского интерфейса, и у вас не будет надлежащего контекста рисования, если вы хотите рисовать непосредственно в UIView.

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

В зависимости от требуемой частоты кадров,многим даже не нужно делать setNeedsDisplay для каждого события touchesMoved, но вы можете поставить в очередь данные и установить флаг для таймера скорости анимации или обратного вызова CADisplayLink для выполнения setNeedsDisplay с более постоянной скоростью (скажем, только 15 или 30 кадров в секунду),Это также поможет устранить лишние операции рисования.

...