Core Graphics- drawRect: недостаточно частые вызовы

В моем приложении у меня есть UIViewController с подклассом UIView (и несколькими другими элементами) внутри него. Внутри UIView, называемого DrawView, в моем методе drawRect: я рисую объект типа сетки таблицы и рисую на ней массив CGPoints. Когда пользователь касается экрана, он вызывает touchesBegan:withEvent: и проверяет, чтобы найти ближайшую к касанию точку на сетке, добавляет точку в массив, из которого метод drawRect: извлекает точки, и вызывает [self setNeedsDisplay]. Когда пользователь перемещает палец по экрану, он проверяет, изменилась ли точка с последнего местоположения, обновляет точку и при необходимости вызывает [self setNeedsDisplay].

Это отлично работает в Симуляторе. Однако при запуске на реальном iPhone он работает очень медленно, когда вы двигаете пальцем, он отстает в рисовании точки. Я читал, что текущие вычисления того, где разместить точки в другом потоке, могут улучшить производительность. У кого-нибудь есть опыт в этом, кто знает это на самом деле? Есть ли другие предложения по уменьшению задержки?


person Josh Sherick    schedule 09.08.2011    source источник


Ответы (1)


Есть ли другие предложения по уменьшению задержки?

да. Не используйте -drawRect:. Это длинная и сложная причина, но в основном, когда UIKit видит, что вы реализовали -drawRect: в своем UIView подклассе, рендеринг проходит по очень медленному программному пути рендеринга. Когда вы рисуете с CALayer объектами и составными представлениями, вы можете получить графику с аппаратным ускорением, что может сделать ваше приложение НАМНОГО более производительным.

person Dave DeLong    schedule 09.08.2011
comment
Отличный ответ. Но как бы вы это сделали? Пользователь использует разные представления для каждого слоя или одно представление с несколькими подслоями? - person Sandro Meier; 09.08.2011
comment
@Sandro тоже будет работать, но я бы, вероятно, использовал UIView объекты вместо CALayers, потому что это оставляет возможность прикреплять распознаватели жестов, имеющие дело с типами ObjC вместо типов CF (UIImage vs CGImageRef и т. Д.) ... - person Dave DeLong; 09.08.2011
comment
Спасибо. Я новичок и совершенно не понимаю, что такое объекты CALayer или составные представления. Я нашел документацию Apple по CALayer, но есть ли другие учебные пособия или документация, по которым вы рекомендуете изучить эти вещи и как их использовать для рисования? - person Josh Sherick; 10.08.2011
comment
@josherick Под составными представлениями я подразумеваю добавление представлений как подвидов других представлений. Вы составляете их вместе, то есть накладываете их друг на друга. (составной используется как глагол, а не прилагательное) - person Dave DeLong; 10.08.2011
comment
подожди, правда? похоже, что для рисования сетки из UIViews потребуется много памяти. и как мне нарисовать линии, соединяющие точки? или даже круг (точка)? - person Josh Sherick; 10.08.2011
comment
@Josherick: да, это немного снижает память, но это НАМНОГО быстрее. Что касается рисования сетки, вы можете нарисовать ее в изображении, а затем вставить изображение в UIImageView, и тогда больше никогда не придется его перерисовывать. - person Dave DeLong; 10.08.2011