- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我希望在 OSX 上获得高分辨率和高帧速率的鼠标移动。
“高帧率”= 60 fps 或更高(最好 > 120)
“高分辨率”=子像素值
问题
我有一个 opengl View 以大约显示器刷新率运行,因此约为 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 值在一帧中将为 0.000,然后下一帧为 1.000,但随后它将再次为 0.000,然后为 2.000,然后再次为 0.000,然后为 3.000、0.000,依此类推。
这意味着 View 将在一帧中旋转 2.000 单位,然后在下一帧中旋转 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 之前尝试点击鼠标事件。所以我创建了一个 CGEventTrap:
eventMask = (1 << kCGEventMouseMoved);
eventTap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap,
0, eventMask, myCGEventCallback, NULL);
//...
myCGEventCallback(...){
double dx = CGEventGetDoubleValueField(event, kCGMouseEventDeltaX);
double dy = CGEventGetDoubleValueField(event, kCGMouseEventDeltaY);
}
仍然值为 n.000
,尽管我相信事件触发率要高一些。但它仍然没有达到 60 fps。我仍然得到上面的图表。
我还尝试过将鼠标灵敏度设置得非常高,然后在我这边缩小这些值。但似乎 OSX 增加了某种加速或其他东西——这些值变得非常“不稳定”,因此无法使用,而且射速仍然太低。
不幸的是,我开始追踪鼠标事件,最终到达了 IOKit。这对我来说很可怕。这是疯帽子。苹果文档变得很奇怪,似乎在说“如果你这么深入,你真正需要的只是头文件”。
所以我一直在阅读头文件。我还发现了一些有趣的花絮。
在 <IOKit/hidsystem/IOLLEvent.h>
第 377 行有这个结构:
struct { /* For mouse-down and mouse-up events */
UInt8 subx; /* sub-pixel position for x */
UInt8 suby; /* sub-pixel position for y */
// ...
} mouse;
看,它说的是子像素位置!好的。然后在<IOKit/hidsystem/IOLLParameter.h>
中的第73行
#define kIOHIDPointerResolutionKey "HIDPointerResolution"
嗯。
总而言之,我感觉 OSX 深入了解子像素鼠标坐标,并且必须有一种方法来读取每一帧的原始鼠标移动,但我只是不知道如何获取这些值.
问题
呃,那么,我在要求什么呢?
(抱歉,帖子太长)
最佳答案
(这是一个很晚的答案,但我认为对于其他偶然发现这一问题的人来说仍然有用。)
您是否尝试过过滤鼠标输入?这可能很棘手,因为过滤往往是滞后和精度之间的权衡。然而,几年前我写了一篇文章,解释了我如何过滤鼠标移动,并为游戏开发网站写了一篇文章。链接为http://www.flipcode.com/archives/Smooth_Mouse_Filtering.shtml .
由于该网站不再处于积极开发状态(并且可能会消失),因此以下是相关摘录:
<小时/>几乎在所有情况下,过滤都意味着平均。然而,如果我们简单地平均鼠标移动随时间的变化,我们就会引入滞后。那么,我们如何在不引入任何副作用的情况下进行过滤呢?好吧,我们仍然会使用平均,但我们会用一些智能来做到这一点。同时,我们将为用户提供对过滤的精细控制,以便他们可以自行调整。
我们将使用随时间变化的平均鼠标输入的非线性过滤器,其中旧值对过滤结果的影响较小。
它是如何工作的
每一帧,无论您是否移动鼠标,我们都会将当前鼠标移动放入历史缓冲区并删除最旧的历史值。因此,我们的历史记录始终包含 X 个样本,其中 X 是“历史缓冲区大小”,代表一段时间内最近采样的鼠标移动。
如果我们使用历史缓冲区大小 10 以及整个缓冲区的标准平均值,则过滤器会引入大量滞后。在 60FPS 的机器上,快速的鼠标移动将落后 1/6 秒。在快速 Action 游戏中,这会非常流畅,但实际上无法使用。在相同的场景中,历史缓冲区大小为 2 会给我们带来非常小的延迟,但过滤效果非常差(玩家 react 粗糙且不稳定。)
非线性滤波器旨在对抗这种互斥的情况。这个想法很简单。我们不是盲目地对历史缓冲区中的所有值进行平均,而是用权重对它们进行平均。我们从权重 1.0 开始。因此历史缓冲区中的第一个值(当前帧的鼠标输入)具有完整的权重。然后,我们将此权重乘以“权重修正值”(例如...0.2),然后移至历史缓冲区中的下一个值。我们走得越远(通过我们的历史缓冲区),这些值对最终结果的权重(影响)就越小。
详细来说,权重修改值为 0.5 时,当前帧的样本将具有 100% 的权重,前一个样本将具有 50% 的权重,下一个最旧的样本将具有 25% 的权重,下一个样本将具有 12.5% 的权重,很快。如果将其绘制成图表,它看起来像一条曲线。因此,权重修改器背后的想法是控制随着历史样本变老,曲线下降的急剧程度。
减少延迟意味着减少权重调节器。将权重调节器减少到 0 将为用户提供原始的、未经过滤的反馈。将其增加到 1.0 将使结果成为历史缓冲区中所有值的简单平均值。
我们将为用户提供两个用于精细控制的变量:历史缓冲区大小和权重修改器。我倾向于使用大小为 10 的历史缓冲区,然后使用权重修改器,直到我满意为止。
关于cocoa - OSX 上的高分辨率和高帧率鼠标坐标? (或者其他解决方案?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6791262/
我带着为 OSX 编写 PAM 模块的永无休止的传奇再次回来了。我已经写好了模块。它在使用 ssh 或启动新的终端窗口或 su 时有效。我真正真正想要的只是 ssh 和登录窗口。 我的 PAM 模块在
我们有一个类似于Soundflower的虚拟音频设备驱动程序。该虚拟设备将在声音系统首选项中列出。每当我们的设备在系统偏好设置中被选择时,它就会阻止空闲 sleep 。如果我们将选择切换为默认输出设备
我带着为 OSX 编写 PAM 模块的永无止境的传奇又回来了。我已经编写了模块。它在使用 ssh 或启动新的终端窗口或 su 时有效。我真的、真的、真的想要的只是 ssh 和登录窗口。 我的 PAM
我想在 osx lion 上安装 pyaudio,但我无法做到。每次我尝试使用 pkg 时,它都不会安装任何东西。当我尝试使用 pip 安装它时,出现以下错误(以及许多其他行): lipo: can'
我使用 Java 进行开发已有很长时间了,但直到最近才从 Windows 切换到 OSX。在 Windows 中,我发现一切都足够简单易懂。我可以将 JDK 安装到一个选择的位置,其中还包括一个 JR
运行 Mac OSX 10.7.5 我想在 USB3 外部硬盘上启用 NTFS 并需要 UUID 来执行此操作( http://ntfsonmac.com ),但 diskutil 拒绝给我 UUID
我正在尝试为 Finder 创建服务,但我的应用程序不需要有 UI。好吧,我只需要一个 UI 来请求用户提供更多信息,我的应用程序有时可能需要这些信息。 但是应用程序应该在没有任何 UI 且 Dock
我正在尝试在我的 mac 上使用本地服务器,但它似乎忽略了/etc/hosts 文件中的 localhost 设置。找到了几个页面,其中解决方案是重新安装,并将 localhost 放在/etc/ho
这是一个 OSX 链接器问题。我不认为 OSX(BSD 或 Mach 层)在乎零页有多大,或者它是否真的存在。我认为这是一个工具的事情。但这是我的意见,这就是我问的原因。 -pagezero_size
我正在构建一个将在 iOS/OSX 应用中使用的模块。 客户坚持认为该模块可以在 iOS 和 OSX 上运行。 我需要检查我在 iOS 和 OSX 上使用 UIDevice 时使用的系统版本 FTWD
我尝试在 OSX 10.8.2 中使用 gnuplot,并看到 x11 是不明确或未知的终端类型。一些研究表明 x11 不受支持,我下载了 XQartz,但我仍然收到相同的错误消息。 我使用 expo
我从官方网站下载了 PostgreSQL 并运行了 .dmg 安装程序。之后我下载了 pgadmin3,我确实能够连接到数据库。 当我运行“psql”时,出现以下错误: psql: could not
自从升级到 OSX Catalina 以来,我一直遇到 UnsatisfiedLinkErrors 问题,尝试在 java 下运行 JNI 包装的库,其中包含多个 native 库引用,这些引用在早期
在 OSX 10.6 上使用 make 构建 C++ 项目时,我确定预处理器定义 __LP64__ 似乎始终自动由编译器(即,它没有在任何头文件中定义)(参见 Where is __LP64__ de
我正在尝试将我的 iOS 应用程序移植到 Mac OS X SDK,并且发现我收到以下错误消息:'Collection' redeclared as a different kind of symbo
我一直在 OSX 10.14 中成功使用我的代码生成 Metal 纹理: let textureLoaderOptions = [MTKTextureLoader.Option.origin : MT
我对编码有些陌生,想用 MySQL 后端启动我的第一个 Django 应用程序。我已经在我的 Windows 机器上使用这个设置将近一年了,但它是一个继承的代码库——不幸的是,我从未尝试过从头开始构建
我正在迁移到一台新计算机,同时从雪豹迁移到狮子。 phpunit 似乎没有进行迁移,所以我重新安装了它。然而,pear 的标准安装似乎不适用于我的 php 家庭brew 安装。这是错误: phpuni
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 已关闭 7 年前。 Improve
我在 OSX10.9 上为我的应用程序构建了一个 Java 7 bundle ,一切看起来都很好,但是当我在 OSX 10.7 上尝试它时,它在启动时崩溃,它已经在 10.7.3 和 10.7.5 上
我是一名优秀的程序员,十分优秀!