Есть ли снижение производительности при вызове [NSCursor set]?
Я занимаюсь разработкой приложения с настраиваемым представлением, в котором пользователь может перемещать объекты вокруг представления. Они могут поднять их и поместить в разные места, и я хочу, чтобы курсор менялся в зависимости от того, какие объекты они могут поднять и где они могут их поместить.
Я использую области отслеживания, но для поддержания правильных курсоров я использую уведомления области отслеживания и устанавливаю курсор для любого движения мыши.
Это работает хорошо, и у меня есть свое решение, но я хотел знать, было ли снижение производительности за вызов [NSCursor set]
так часто или если AppKit
может справиться с этим без проблем?
Обновление: по совету Rob Keniger я профилировал приложение и не видел реального времени, потраченного на смену курсоров. На всякий случай я реализовал простой макрос, который сохраняет текущее состояние курсора и устанавливает его только при необходимости, как определено здесь:
// Values for _currentCursor
#define CURRENT_CURSOR_UNKNOWN 0
#define CURRENT_CURSOR_ARROW 1
#define CURRENT_CURSOR_POINTINGHAND 2
#define CURRENT_CURSOR_OPENHAND 3
#define CURRENT_CURSOR_CLOSEDHAND 4
#define CURRENT_CURSOR_NOENTRY 5
#define CURRENT_CURSOR_HIDDEN 0x80
#define SET_CURSOR(current, cursor) \
if ((_currentCursor & CURRENT_CURSOR_HIDDEN) == 0 && _currentCursor != current) \
{ \
[cursor set]; \
_currentCursor = current; \
}
Вы бы вызвали это в коде так:
SET_CURSOR(CURRENT_CURSOR_CLOSEDHAND, [NSCursor closedHandCursor]);
1 ответ
Во-первых, что касается производительности, тестировали ли вы ее? Apple предоставляет отличные инструменты для профилирования. С инструментами вы очень быстро узнаете, какая часть производительности поражает курсор, вызываемый изменением вызовов. Не угадай, профиль.
Во-вторых, почему вы не используете mouseEntered:
а также mouseExited:
события, чтобы изменить курсор, а не mouseMoved:
событие? Чаще всего курсор нужно менять только тогда, когда мышь входит или выходит из области отслеживания, верно?
Если вам нужен более детальный контроль (например, я мог бы видеть, что это может быть в случае, если вам нужно выбрать непрямоугольный объект), и если вызов изменения курсора оказывается дорогим (я очень сомневаюсь в этом), вы должны просто сохранить текущее состояние курсора и в mouseMoved:
событие, проверьте, нужно ли изменить курсор, а затем измените его, если так.
Тем не менее, я подозреваю, что то, что вы уже делаете, окажется очень хорошо, так как NSCursor
вероятно, делает аналогичную проверку, если вы звоните [NSCursor set]
с тем же курсором, что и текущий курсор.