Я собираюсь пойти дальше и предположить, что в вашем CGContext по-прежнему включен сглаживание, но если нет, то это первое очевидное решение, которое нужно попробовать, как говорит комментарий @ Davyd: CGContextSetShouldAntialias
- функция интереса .
Предполагая, что это не проблема, и строка сглаживается контекстом, но вы все еще хотите что-то "более мягкое". Я могу придумать пару способов сделать это, которые, мы надеемся, будут быстрее, чем поглаживание в 5 раз.
Во-первых, вы можете попробовать получить обведенный путь (т. Е. Путь, который описывает контур обводки текущего пути), используя CGContextReplacePathWithStrokedPath
, затем вы можете заполнить этот путь градиентом (или любой другой метод заливки, который дает желаемый Результаты.) Это будет хорошо работать для прямых линий, но не будет простым для кривых путей (поскольку градиент заполняет область обведенного пути и будет либо линейным, либо радиальным.)
Еще один, возможно, менее очевидный вариант, возможно, состоит в том, чтобы использовать для этого теневой рисунок CG. Функция, которую вы хотите найти: CGContextSetShadowWithColor
Вот метод:
- Сохранить GState:
CGContextSaveGState
- Получите ограничивающий прямоугольник исходного пути
- Скопируйте путь, переведя его от себя на 2.0 * bbox.width, используя
CGPathCreateCopyByTransformingPath
(примечание: используйте только направление X, так что вам не нужно беспокоиться о переворотах в контексте)
- Обрезать контекст к исходному bbox, используя
CGContextClipToRect
- Установить тень для контекста с помощью
CGContextSetShadowWithColor
:
- Некоторое минимальное размытие (начните с 0,5 и перейдите оттуда. Параметр размытия нелинейный, а IME - это своего рода операция угадывания и проверки)
- Смещение, равное -2.0 * ширина bbox и высота 0.0, масштабированные до базового пространства. (Примечание: эти смещения находятся в базовом пространстве. Это будет невыносимо выяснять, но при условии, что вы не добавляете свои собственные масштабные преобразования, масштабный коэффициент будет либо 1,0, либо 2,0, так что практически вы будете устанавливать смещение: ширина -2,0 * bbox.width или -4,0 * bbox.width)
- Цвет по вашему выбору.
- Пройдите по переведенному пути.
- Выскочить GState
CGContextRestoreGState
Это должно оставить вас с "просто" тенью, которую вы можете настроить, чтобы добиться желаемых результатов.
Все это говорит о том, что производительность рисования теней в CG, IME, менее чем полностью удивительна и менее чем полностью детерминирована. Я ожидал бы, что это будет быстрее, чем 5 раз поглаживать путь, но не в подавляющем большинстве случаев.
Это будет зависеть от того, сколько стоит достижение этого эффекта для вас.