Есть ли снижение производительности при вызове [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] с тем же курсором, что и текущий курсор.

Другие вопросы по тегам