2

ユーザーがビュー内でオブジェクトを移動できるカスタム ビューを使用してアプリケーションを開発しています。彼らはそれらを拾って別の場所に置くことができます。拾うことができるオブジェクトと置くことができる場所に応じて、カーソルを変更したいと思います。

トラッキング エリアを使用していますが、正しいカーソルを維持するために、トラッキング エリア通知を使用し、マウスの動きに合わせてカーソルを設定しています

これはうまく機能しており、解決策はありますが、[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]);
4

1 に答える 1

2

まず、パフォーマンスに関しては、テストしましたか? Apple はプロファイリングのための優れたツールを提供しています。Instruments を使用すると、カーソル変更呼び出しが原因でパフォーマンスがどれだけ低下したかをすぐに知ることができます。推測しないでください、プロフィール。

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

より細かい制御が必要な場合 (たとえば、四角形以外のオブジェクトを選択する必要がある場合にこれが当てはまる可能性があることがわかります)、およびカーソル変更呼び出しが高価であることが判明した場合 (私はそれを非常に疑っています) )、カーソルの現在の状態を保存し、mouseMoved:イベントでカーソルを変更する必要があるかどうかを確認し、必要な場合は変更する必要があります。

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

于 2012-03-10T00:07:11.537 に答える