私はOSXで高解像度と高フレームレートでマウスの動きを取得したいと思います。OSXでの高解像度と高いフレームレートのマウス座標? (または他の解決策?)
"ハイフレームレート" = 60 FPS以上(好ましくは> 120)
"高解像度" =サブピクセルは
値問題
私はおよそモニターのリフレッシュレートで実行されているOpenGLのビューを持っていますしたがって、〜60 fpsです。私は周りを見回すためにマウスを使用するので、私はマウスのカーソルを隠して、私はマウスのデルタ値に頼っています。
問題は、マウスイベントが非常に低いフレームレートで入力され、値が整数(ピクセル全体)にスナップされることです。これにより、「不安定な」視聴体験が発生します。ここで時間をかけて、マウスのデルタ値の可視化です:
mouse delta X
^ xx
2 | x x x x xx
| x x x x xx x x x
0 |x-x-x--xx-x-x-xx--x-x----x-xx-x-----> frame
|
-2 |
v
これが右にマウスを少し動かすユーザから作成した典型的な(短縮)曲線です。各xは各フレームのdeltaX値を表し、deltaX値は整数に丸められているため、このグラフは実際にはかなり正確です。見て分かるように、deltaXの値は1つのフレームで0.000、次に1.000であるが、再び0.000、次に2.000、そして再び0.000、そして3.000,0.000などとなる。
これは、ビューが2.000単位を1フレーム回転させ、次に0.000単位を回転して3.000単位を回転することを意味します。これは、マウスが多かれ少なかれ一定速度でドラッグされている間に発生します。言うまでもなく、これはやっかいなようです。
どうすれば1)マウスのイベントフレームレートを増やすことができますか? 2)サブピクセル値を取得する?
は、これまでのところ
私は次のことを試してみた:
- (void)mouseMoved:(NSEvent *)theEvent {
CGFloat dx, dy;
dx = [theEvent deltaX];
dy = [theEvent deltaY];
// ...
actOnMouse(dx,dy);
}
まあ、これは明らかでした。 dx
ここではfloatですが、値は常に丸められます(0.000,1.000など)。上記のグラフが作成されます。
次のステップは、WindowServerに入る前にマウスイベントを試してみることでした。私はイベントの発火率が少し高くなっていると考えているものの、
eventMask = (1 << kCGEventMouseMoved);
eventTap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap,
0, eventMask, myCGEventCallback, NULL);
//...
myCGEventCallback(...){
double dx = CGEventGetDoubleValueField(event, kCGMouseEventDeltaX);
double dy = CGEventGetDoubleValueField(event, kCGMouseEventDeltaY);
}
はまだ値がn.000
次のとおりです。だから私はCGEventTrapを作成しました。しかしそれはまだ60 fpsではありません。私はまだ上記のチャートを取得します。
また、マウスの感度を高く設定してから、私の側で値を下げてみました。しかし、OSXはある種の加速や何かを追加しているようだ。値は本当に「不安定」になり、結果的には使えなくなり、火の速さはまだまだ低い。
私は運がないので、ウサギの穴の中でマウスのイベントに従っています。私はIOKitに到着しました。これは私のために怖いです。それは狂ったことだ。アップルのドキュメントは奇妙になり、「もしあなたがこの深いところにいるなら、本当に必要なのはヘッダファイルだ」と言われるようです。
私はヘッダーファイルを読んでいます。そして私はいくつかの面白い小物を見つけました。ライン377上の<IOKit/hidsystem/IOLLEvent.h>
で
この構造体があります:
struct { /* For mouse-down and mouse-up events */
UInt8 subx; /* sub-pixel position for x */
UInt8 suby; /* sub-pixel position for y */
// ...
} mouse;
を参照してください、それはサブピクセル位置を言います! OK。その後、73行目に<IOKit/hidsystem/IOLLParameter.h>
#define kIOHIDPointerResolutionKey "HIDPointerResolution"
Hmm。
OSXはサブピクセルのマウス座標を深く知っていると感じています。マウスの生の動きをフレームごとに読み取る方法が必要ですが、それらを取得する方法はわかりません値。
質問
私は何を求めていますか?
- OSXで高いフレームレートのマウスイベントを取得する方法はありますか? (例コード?)
- OSXでサブピクセルのマウス座標を取得する方法はありますか? (例コード?)
- フレームごとに「生の」マウスデルタを読み取る方法はありますか? (つまり、は、はイベントに依存しません)
- NXEventsを取得する方法、またはHIDParametersを設定する方法はありますか?コード例?マックOS Xは、解像度に依存しないように設計されているため(だから私は自分自身でこれを深く掘ることができます...)
(長い記事のために申し訳ありませんが)