2012-03-09 44 views
2

我正在開發一個自定義視圖的應用程序,用戶可以在視圖周圍移動對象。他們可以把它們拿起來放在不同的地方,我希望光標可以根據他們可以拾取的物品和放置的位置進行更改。調用[NSCursor set]是否有性能問題?

我使用的是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

首先,關於性能,你測試過了嗎? Apple爲分析提供了出色的工具。使用樂器,您將很快發現多少性能影響了光標變化的呼叫。不要猜測,簡介。

其次,爲什麼不使用mouseEntered:mouseExited:事件來更改光標而不是mouseMoved:事件?大多數情況下,光標需要更改的唯一時間是鼠標進入或退出跟蹤區域時,對嗎?

如果您確實需要更細粒度的控件(例如,如果您需要選擇非矩形對象,則可能會出現這種情況),並且如果光標更改調用變得非常昂貴(I非常懷疑它),您應該只保存遊標的當前狀態並在mouseMoved:事件中檢查遊標是否需要更改,如果是,則更改它。

但是,我懷疑你已經做的事情會變得很好,因爲NSCursor可能會做類似的檢查,如果你用與當前光標相同的光標調用[NSCursor set]

+0

感謝羅布 - 我知道你會是一個回答:)你是對的,我需要配置文件,現在會這樣做,但是你錯了,光標只需要改變進入/退出跟蹤區域因爲光標用於向用戶反饋他們可以做什麼和不可以做什麼。這包括哪些* object *在視圖中可以拾取,以及視圖中的哪些位置可以放置* object *。 – trojanfoe 2012-03-10 10:12:41

+0

@trojanfoe:那麼你不應該製作更多,更小的跟蹤區域嗎? – 2012-03-10 16:03:07

+0

@PeterHosey我可以,是的,但有太多不同的地方可以輕鬆管理。目前的解決方案似乎沒問題 - 我真的很想知道是否過度使用'[NSCursor set]'對AppKit沒有影響。 – trojanfoe 2012-03-10 19:04:35