Моя текущая попытка состоит в том, чтобы напрямую нарисовать NSBezierPaths в NSView. Представление выглядит красиво, но очень, очень медленно, даже если я рисую только ограниченное подмножество точек за раз. И каждый раз, когда я прокручиваю, мне приходится перерисовывать, что тоже медленно.
Прежде чем принимать какие-либо радикальные решения, попробуйте выполнить следующие простые действия:
- Clip. Используйте
NSRectClip
, передавая прямоугольник, который вы берете в качестве аргумента, drawRect:
. Это однострочник.
- Выполните простое тестирование прямоугольника перед заполнением путей. Для каждого пути получите его границы и используйте
NSIntersectsRect
, чтобы проверить, находится ли он внутри прямоугольника.
- Выполните чуть-чуть менее простое тестирование прямоугольника перед штриховкой. Аналогично предыдущему шагу, за исключением того, что вам нужно увеличить прямоугольник (тот, который вы получили в качестве аргумента) по ширине линии, поскольку половина хода выпадет за пределы дорожки.
Для каждого пути получите ширину линии и отрицайте ее (
delta = -[path lineWidth]
- и да, вы должны включить этот знак минуса), а затем передать результат в качестве обоих аргументов NSInsetRect
. Обязательно сохраняйте исходный прямоугольник, так как разные пути могут иметь разную ширину линии.
Идея в том, чтобы просто рисовать меньше. Установка обтравочного контура (используя NSRectClip
) уменьшит количество бликов, возникающих в результате операций рисования. Исключение путей, которые полностью выходят за пределы прямоугольника рисования, сэкономит вам, вероятно, более дорогое ограничение для этих путей.
И, конечно, вы должны регистрировать на каждом шаге, чтобы убедиться, что вы не сделали вещи медленнее. Возможно, вы захотите настроить какой-нибудь счетчик частоты кадров.
Еще одна вещь: получение границ для каждого пути может быть дорогим. (Опять же, профиль.) Если это так, вы можете кэшировать границы для каждого пути, возможно, используя параллельные NSArray
из NSValue
s или объединяя путь и границы в объекте вашего собственного изобретения. Затем вы вычисляете границы только один раз и просто извлекаете их при будущих запусках чертежей.