【问题标题】:Is there a performance hit from calling [NSCursor set]?调用 [NSCursor set] 是否会影响性能?
【发布时间】:2012-03-09 19:12:37
【问题描述】:

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

我正在使用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]);

【问题讨论】:

    标签: macos cocoa nsview nscursor


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢 Rob - 我知道你会回答 :) 你是对的,我需要分析并且现在会这样做,但是你错了,光标只需要在输入时改变/退出跟踪区域作为光标用于向用户提供他们可以做什么和不能做什么的反馈。这包括他们可以在视图中拾取哪些 object 以及他们可以在视图中的哪个位置放置 object
    • @trojanfoe:那么你不应该制作更多、更小的跟踪区域吗?
    • @PeterHosey 我可以,是的,但是有太多不同的领域需要轻松管理。当前的解决方案似乎还可以 - 我真的很想知道过度使用 [NSCursor set] 是否对 AppKit 没有影响。
    猜你喜欢
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    • 2013-06-14
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-28
    相关资源
    最近更新 更多