Я нашел, что время окраски строк зависит от количества различных NSColors. В приведенном ниже коде, если я использую только один цвет для трех случаев, процесс окрашивания текста в 3 раза быстрее, чем в случае, когда для этих трех случаев используются три разных цвета, каждый цвет для каждого случая. Зачем ? Есть ли способ не замедлить окраску для трех разных цветов?Как использовать цвет для раскраски текста без замедления процесса?
for i in 0..<arrayOfNSRangesForA.count
{
textFromStorage.addAttribute(NSForegroundColorAttributeName, value: NSColor.green, range: arrayOfNSRangesForA[i])
}
for i in 0..<arrayOfNSRangesForT.count
{
textFromStorage.addAttribute(NSForegroundColorAttributeName, value: NSColor.green, range: arrayOfNSRangesForT[i])
}
for i in 0..<arrayOfNSRangesForC.count
{
textFromStorage.addAttribute(NSForegroundColorAttributeName, value: NSColor.green, range: arrayOfNSRangesForC[i])
}
Update я нашел еще одну вещь BAD. Когда я изменил окраску от NSForegroundColorAttributeName
до NSBackgroundColorAttributeName
, время работы значительно увеличилось - в 10 раз. Для 20 000 символов это было для одного цвета, для NSForegroundColorAttributeName
- 1 сек., Для NSBackgroundColorAttributeName
- 10 сек; если три цвета - 3 и 30 секунд соответственно. Для меня это очень плохая особенность Swift !!! Невозможно выполнить нормальную работу с окраской ДНК (ATGC), поскольку длина ДНК составляет тысячи символов A, T, G, C!
Обновление В комментариях у меня есть предложение по цвету только видимой части текста. Я пробовал этот подход, и это намного хуже даже для более короткого текста по сравнению с тем, что я делал стандартным образом. Таким образом, у меня был NSRange текста для видимой части текста и выполнялся раскраска на лету, прокручивая с помощью уведомления при прокрутке. Это плохо.
В зависимости от конкретных диапазонов, к которым применяется цвет, они могут объединяться в один проход всех одинаковых атрибутов. Или, по крайней мере, меньше пробегов, чем при использовании цветов разницы. Для каждой операции есть отдельная операция рисования с накладными расходами для каждой операции. Вы можете использовать 'enumerateAttributes (in: options: using:)', чтобы узнать, сколько прогонов существует для каждого случая. –
@Ken Thomases Я проверил строку около 180 000 символов, состоящую из символов A, G, T и C в разных количествах, на самом деле это последовательность ДНК. Сначала я определяю диапазоны для каждого A, G, T и C. Итак, у меня есть 4 массива диапазонов, а затем I цветные символы A, G, T и C. – VYT
@ Ken Thomases, поскольку массивы для каждого C, G, A и T одинаковы для одного цвета или для трех цветов, объединение уровней может происходить только во время процесса окрашивания, а затем это означает, что некоторая окраска для каждого цикла зависит от других циклов ?? – VYT