Основная производительность текста - PullRequest
17 голосов
/ 19 мая 2011

Я вижу некоторые проблемы с производительностью Core Text, когда он запускается на оригинальном iPad.

Я создал редактируемое представление, используя Core Text и протокол UITextInput, основанный на OUIEditableFrame OmniGroup..

Если в представлении достаточно текста, скажем, 180 строк, набор текста / ввод данных значительно отстает, а одно нажатие клавиши обычно занимает 1-2 секунды.

Использование инструментов сНа симуляторе мне удалось сузить проблему и выяснить, что занимает столько времени.Оказывается, это потому, что я перерисовываю фрейм с каждым нажатием клавиши, так много времени уходит на вызовы CTFramesetterCreateWithAttributedString и CTFramesetterCreateFrame.

Я должен перерисовывать с каждым нажатием клавиши, чтобы текст обновлялся,это значит звонить CTFramesetterCreateWithAttributedString и CTFramesetterCreateFrame.

Кто-нибудь еще сталкивался с этой проблемой, и если да, то как они ее обошли?


РЕДАКТИРОВАТЬ:

Провел дальнейшие исследования и выяснил, что если приписанная строка не имеет атрибутов, то все отрисовывается намного быстрее и без каких-либо задержек.Изменение шрифта, цвета или стиля абзаца замедляет его.Любая идея, если это может иметь какое-то отношение к этому?

Ответы [ 4 ]

9 голосов
/ 19 мая 2011

Вы, вероятно, не должны использовать CTFramesetter для создания чего-то вроде UITextView.Вместо этого вы, вероятно, должны хранить массив CTLine ссылок.Если вам нужна помощь с разрывом слов, тогда вы можете использовать CTTypeSetter, но вам нужно только передать ему строки с текущей кареткой и ниже (вы все равно будете немного создавать и уничтожать наборщики текста, так что смотрите, сколько вы проситеиз них).

Хорошая особенность хранения массива CTLines состоит в том, что вы можете выбросить ненужные, если у вас мало памяти, и восстановить их позже.Просто следите за диапазоном символов для каждой строки.

5 голосов
/ 03 июня 2011

Начиная с моего первоначального вопроса, я провел еще несколько исследований и выяснил, что чем больше атрибутов у нарисованной строки, тем дольше она занимает.

С этим знанием я решил просто удалить / скрыть любые атрибуты (в частности, kCTForegroundColor), которые пользователь не мог видеть, это ускорило процесс рисования в десять раз и сделало его гораздо более удобным.

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

Альтернативный подход - продолжать использовать CTFramesetter, но использовать меньшие CTFrames.Просто добавьте NSAttributedString в подстроки (например, используя [NSString paraRangeForRange:], чтобы получить диапазоны абзацев, а затем разбейте вашу атрибутированную строку, используя attributetedSubstringFromRange :).Затем создайте CTFrame для каждого абзаца.Когда что-то меняется (например, пользователь что-то печатает), вы обновляете только те CTFrame, которые изменились.

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

0 голосов
/ 10 января 2013

Я экспериментировал с использованием CTLines и UITableView в моих попытках сделать подсветку синтаксиса на iOS.Самое замечательное в tableView заключается в том, что вы можете обновлять, удалять и вставлять строку и перерисовывать только эту строку.

CTFramesetterCreateWithAttributedString действительно медленно.Таким образом, чем меньше вы используете его, тем лучше.Если пользователь вводит что-то, что вам не нужно снова разбивать весь текст на строки, вы можете просто обновить текущую строку, а если она переполнена, вы можете вставить новую.Нужно потрудиться, чтобы заставить его работать в каждом случае, но производительность может быть потрясающей.

Вот что я сделал: https://github.com/Anviking/Chromatism.

...