调用[NCursor 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]);

首先,关于性能,您测试过吗?苹果提供了优秀的评测工具。使用Instruments,您将很快发现更改光标的调用对性能的影响有多大。不要猜测,侧面。

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

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

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

最新更新