Есть ли снижение производительности при вызове [NSCursor set]? - PullRequest
2 голосов
/ 09 марта 2012

Я занимаюсь разработкой приложения с настраиваемым представлением, в котором пользователь может перемещать объекты вокруг представления.Они могут поднять их и поместить в разные места, и я хочу, чтобы курсор менялся в зависимости от того, какие объекты они могут поднять и где они могут их разместить.

Я использую области отслеживания , но для поддержания правильных курсоров я использую уведомления области отслеживания и устанавливаю курсор для любого движения мыши.

Это работает хорошо, и у меня есть свое решение, но я хотелузнать, было ли снижение производительности за столь частый вызов [NSCursor set] или если AppKit может справиться с этим без проблем?

Обновление : в соответствии с рекомендациями Роб Кенигер Я профилировал приложение и не видел реального времени, потраченного на смену курсоров.На всякий случай, я реализовал простой макрос, который сохраняет текущее состояние курсора и устанавливает его только при необходимости, как определено здесь:

// 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 Ответ

1 голос
/ 10 марта 2012

Во-первых, что касается производительности, тестировали ли вы ее?Apple предоставляет отличные инструменты для профилирования.С инструментами вы очень быстро узнаете, какая часть производительности поражает курсор, вызываемый изменением вызовов.Не угадайте, профиль.

Во-вторых, почему вы не используете события mouseEntered: и mouseExited: для изменения курсора, а не событие mouseMoved:?Чаще всего курсор нужно менять только тогда, когда мышь входит или выходит из области отслеживания, верно?

Если вам нужен более точный контроль (например, я мог видеть, что это может бытьв случае, если вам нужно выбрать непрямоугольный объект) и если вызов смены курсора оказывается дорогостоящим (я очень в этом сомневаюсь), вам следует просто сохранить текущее состояние курсора и в mouseMoved:В этом случае проверьте, нужно ли изменить курсор, а затем измените его, если это так.

Однако я подозреваю, что то, что вы уже делаете, окажется в порядке, поскольку, вероятно, NSCursorаналогичная проверка, если вы вызываете [NSCursor set] с тем же курсором, что и текущий курсор.

...