相关疑难解决方法(0)

8
推荐指数
2
解决办法
735
查看次数

OSX上的高分辨率和高帧率鼠标坐标?(或其他解决方案?)

我想在OSX上以高分辨率和高帧率获得鼠标移动.

"高帧率"= 60fps或更高(优选> 120)
"高分辨率"=子像素值

问题
我有一个大约在显示器刷新率下运行的opengl视图,所以它是~60 fps.我用鼠标环顾四周,所以我隐藏了鼠标光标,我依赖鼠标delta值.

问题是鼠标事件的帧速率太低,值被捕捉到整数(整个像素).这会导致"波涛汹涌"的观看体验.以下是鼠标增量值随时间变化的可视化:

    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
Run Code Online (Sandbox Code Playgroud)

这是用户将鼠标稍微向右移动而创建的典型(缩短)曲线.每个x代表每个帧的deltaX值,并且由于deltaX值四舍五入为整数,因此该图实际上非常准确.我们可以看到,deltaX值将是0.000一帧,然后是1.000,然后它将再次为0.000,然后是2.000,然后再次为0.000,然后是3.000,0.000,依此类推.

这意味着视图将在一帧中旋转2.000个单位,然后在下一个旋转0.000个单位,然后旋转3.000个单位.当鼠标以或多或少的恒定速度拖动时会发生这种情况.不用说,这看起来像垃圾.

那么,我怎样才能增加鼠标的事件帧率?2)获取子像素值?

到目前为止,
我已经尝试了以下内容:

- (void)mouseMoved:(NSEvent *)theEvent {
    CGFloat dx, dy;
    dx = [theEvent deltaX];
    dy = [theEvent deltaY];
    // ...
    actOnMouse(dx,dy);
}
Run Code Online (Sandbox Code Playgroud)

嗯,这个很明显.dx这里是浮点数,但值总是四舍五入(0.000,1.000等).这将创建上面的图形.

所以下一步是在进入WindowServer之前尝试点击鼠标事件,我想.所以我创建了一个CGEventTrap:

eventMask = (1 << kCGEventMouseMoved);
eventTap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap,
            0, eventMask, myCGEventCallback, NULL);
//...
myCGEventCallback(...){ …
Run Code Online (Sandbox Code Playgroud)

macos mouse cocoa iokit

7
推荐指数
2
解决办法
1912
查看次数

标签 统计

cocoa ×2

iokit ×1

macos ×1

morphic ×1

mouse ×1

objective-c ×1

pharo ×1

smalltalk ×1