2

我正在开发一个具有自定义视图的应用程序,用户可以在其中移动视图周围的对象。他们可以捡起它们并将它们放在不同的地方,我想根据他们可以拾取的对象以及可以将它们放置的位置来改变光标。

我正在使用跟踪区域,但为了保持正确的光标,我正在使用跟踪区域通知并将光标设置为任何鼠标移动。

这运作良好,我有我的解决方案,但我想知道[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]);
4

1 回答 1

2

首先,关于性能,你测试过吗?Apple 提供了出色的分析工具。使用 Instruments,您将很快发现光标更改调用对性能造成的影响有多大。别猜了,简介。

其次,你为什么不使用mouseEntered:mouseExited:事件来改变光标,而不是mouseMoved:事件?大多数时候,光标需要改变的唯一时间是鼠标进入或退出跟踪区域,对吧?

如果您确实需要更细粒度的控制(例如,如果您需要选择非矩形对象,我可能会看到这种情况)并且如果光标更改调用结果很昂贵(我非常怀疑它),您应该只存储光标的当前状态,并在mouseMoved:事件中检查光标是否需要更改,如果需要更改它。

但是,我怀疑您已经在做的事情会变得很好,如果您使用与当前光标相同的光标进行NSCursor调用,可能会进行类似的检查。[NSCursor set]

于 2012-03-10T00:07:11.537 回答