Временные текстовые атрибуты, вызывающие значительное замедление - PullRequest
2 голосов
/ 15 декабря 2008

Я использую код, который я отправил в качестве ответа на этот вопрос , чтобы отобразить скрытые символы в NSTextView в виде маркеров.

Я окрашиваю пули в серый цвет с помощью addTeoraryAttributes: forCharacterRange: метод NSLayoutManager. Каждый диапазон имеет длину 1 и окрашивает одну пулю. (Большая часть того же текста, который я использую, имеет относительно немного смежных скрытых символов, хотя это оптимизация, которую я планирую сделать в будущем.)

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

1 Ответ

2 голосов
/ 15 декабря 2008

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

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

Вы можете получить диапазон видимого текста из текстового представления:

- (NSRange)visibleRange
{
    NSRect visibleRect = [textView visibleRect];

    NSRange glyphVisibleRange = [[textView layoutManager] glyphRangeForBoundingRect:visibleRect inTextContainer:[textView textContainer]];
    NSRange charVisibleRange = [[textView layoutManager] characterRangeForGlyphRange:glyphVisibleRange  actualGlyphRange:nil];
    return charVisibleRange;
}

Итак, когда вы делаете раскрашивание, раскрашивайте только те глифы, которые попадают в этот диапазон. Это должно улучшить производительность прокрутки на несколько порядков.

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