2012-03-09 22 views
2

私はユーザーがビューの周りにオブジェクトを移動することができるカスタムビューでアプリケーションを開発しています。彼らはそれらを拾い上げて別の場所に置くことができ、どのオブジェクトを持ち上げることができ、どこに置くことができるかによってカーソルを変えたいと思う。[NSCursor set]を呼び出すと、パフォーマンスが低下しますか?

私はtracking areasを使用していますが、正確なカーソルを維持するために、私は追跡エリア通知を使用して、のいずれかのマウス移動のカーソルを設定しています。

これはうまくいっていますが、私は解決策がありますが、[NSCursor set]を頻繁に呼び出したり、これを問題なく処理することができるかどうかを知りたかったのですか? :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はプロファイリングのための優れたツールを提供しています。インストゥルメントを使用すると、コールが変化しているカーソルがどのくらいのパフォーマンスを発揮しているかを素早く知ることができます。推測しないで、プロフィール。

第2に、mouseMoved:イベントではなく、mouseEntered:イベントとmouseExited:イベントを使用してカーソルを変更しているのはなぜですか?ほとんどの場合、カーソルを変更する必要があるのは、マウスがトラッキングエリアに入ったり出たりするときだけです。

細かい制御が必要な場合(たとえば、非長方形のオブジェクトを選択する必要がある場合など)、カーソル変更呼び出しが高価になる場合がありますカーソルの現在の状態を保存し、mouseMoved:イベントにカーソルを変更する必要があるかどうかを確認し、変更する必要がある場合は変更してください。

しかし、NSCursorは、現在のカーソルと同じカーソルで[NSCursor set]を呼び出すと、おそらく同様のチェックが行われるため、既に行っていることがうまくいくと思われます。

+0

ありがとうございます。私はあなたが答えたい人であることを知っていました。私はプロファイルを作成する必要がありますが、現在はそうしていますが、追跡領域に入る/出るときにカーソルを変更するだけで間違っているカーソルは、ユーザーにできることとできないことのフィードバックを与えるために使用されるので、これには、ビュー内の* object *がピックアップ可能で、ビュー内で* object *をドロップできる場所が含まれます。 – trojanfoe

+0

@trojanfoe:トラッキングエリアを増やして、より小さくするべきですか? –

+0

@PeterHosey私はそうでしたが、簡単に管理するには余りにも多くの分野があります。現在の解決策はOKと思われます - 私は本当に '' [NSCursor set]をオーバーするとAppKitと違いがないかどうか知りたかったのです。 – trojanfoe

関連する問題