调用[NSCursor set]是否会影响性能?

时间:2012-03-09 19:12:37

标签: macos cocoa nsview nscursor

我正在开发一个具有自定义视图的应用程序,用户可以在视图周围移动对象。他们可以拿起它们并将它们放在不同的地方,我希望光标可以根据它们可以拾取的物体以及它们放在哪里来改变。

我正在使用tracking areas,但为了维护正确的游标,我正在使用跟踪区域通知并为任何鼠标移动设置光标。

这很好用,我有我的解决方案,但是我想知道是否经常调用[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 个答案:

答案 0 :(得分:1)

首先,关于性能,你测试过吗? Apple提供了出色的分析工具。使用Instruments,您可以非常快速地了解光标更改调用导致的性能损失程度。不要猜,简介。

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

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

然而,我怀疑你已经做的事情会变得很好,因为NSCursor如果用与当前光标相同的光标调用[NSCursor set],可能会进行类似的检查光标。