macos - 调用 [NSCursor set] 是否会对性能造成影响?

标签 macos cocoa nsview nscursor

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

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

最佳答案

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

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

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

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

关于macos - 调用 [NSCursor set] 是否会对性能造成影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9639669/

相关文章:

macos - 为什么我的 Firemonkey 应用程序在 OSX 上打开终端窗口,但在 Win32 上却打不开?

objective-c - OSX/Objective-C 窗口管理 : manipulate the frames & visibility of other applications

objective-c - 部署到 10.6 时出现 ARC 错误

cocoa - Cocoa 的属性编辑器控件?

php - 在 Mac 上将 PHP/MySQL/HTML 生成的报告转换为 PDF 格式

macos - 使用 Cocoa 替换 PDF 中的文本

objective-c - 为 NSComboBox 项目设置工具提示

Xcode 找不到 pod 库

cocoa NSView : Making circles but they are getting cropped

cocoa - 如何将托管 NSView 的图层渲染到文件