介绍
Ixeris
概述
Ixeris 是一个通过优化事件轮询来提升客户端性能的模组。
你可能注意到,移动鼠标时 FPS 会明显下降。部分 FPS 降低是因为转动视角时,游戏需要执行额外的工作,例如计算区块的可见性。然而,由于原生代码在轮询事件时效率低下,以及 JNI 回调开销,一部分原本可以用于渲染的 CPU 时间被不必要地耗费在了事件轮询上。在 Windows 上,这种情况尤为明显,尤其是当鼠标轮询率较高时。
Ixeris 主要通过以下两项措施解决这一问题:
- 多线程事件轮询。Ixeris 不再让渲染和事件轮询运行在同一线程上,而是让事件轮询在主线程中执行,并将渲染交给单独的渲染线程。
- 缓冲原始输入(仅限 Windows)。将输入轮询方式从效率低下的
GetRawInputData(每个输入事件调用一次)切换为GetRawInputBuffer,后者允许批量读取原始输入消息(所有事件只需调用一次)。此外,在 Java 代码中执行这项工作还使我们能够消除 JNI 回调开销。
基准测试
这些测试均在世界完全加载且帧率稳定后进行。
测试 1:游戏内
该测试比较鼠标被捕获时的性能,即光标不可见时的性能。测试在没有实体的超平坦世界中进行。
该测试在 Windows 上进行,Ixeris 默认使用缓冲原始输入来提升性能。“Ixeris,未缓冲”列显示的是禁用该选项后的 FPS。
| 轮询率 | 未使用 Ixeris | Ixeris,未缓冲 | Ixeris,已缓冲 |
|---|---|---|---|
| 8000 Hz | 12 FPS | 83 FPS(6.9 倍) | 121 FPS(10.1 倍) |
| 2000 Hz | 76 FPS | 114 FPS(1.50 倍) | 135 FPS(1.78 倍) |
| 500 Hz | 134 FPS | 145 FPS(1.08 倍) | 151 FPS(1.13 倍) |
测试 2:菜单中
该测试比较鼠标未被捕获时的性能,即光标可见时的性能,例如 F3+Esc 暂停界面。在这种情况下,游戏不会使用原始输入,因为它需要知道实际的光标位置,而不是原始的相对移动量。轮询率为 1000Hz。
“空闲 FPS”列显示鼠标未移动时的 FPS,后面两列则分别显示快速在游戏窗口上移动鼠标时,未使用 Ixeris 和使用 Ixeris 的 FPS。请注意,该测试是在 Ixeris 首次发布时进行的,此后已经进行了许多改进。
| 空闲 FPS | 未使用 Ixeris | 使用 Ixeris | |
|---|---|---|---|
| Windows | 233 FPS | 133 FPS | 165 FPS(1.24 倍) |
| Linux(X11) | 358 FPS | 320 FPS | 355 FPS(1.11 倍) |
| Linux(Wayland) | 364 FPS | 289 FPS | 298 FPS(1.03 倍) |
技术细节
线程安全
在当前状态下,Ixeris 不应破坏线程安全性。通过 glfwSet*Callback 注册的回调会在渲染线程上执行。如果在其他线程中调用了必须在主线程上调用的 GLFW 函数,这些调用会被分派到主线程。这些调用如果可以安全延迟,可能会立即返回;否则可能会阻塞调用方,直到调用完成。
从 3.1.0 版本开始,Ixeris 严格遵守 GLFW 文档中的线程安全要求。
GLFW 状态缓存
大多数 GLFW 函数都必须在主线程中调用。然而,许多模组可能会在渲染线程中调用它们。为避免线程间通信带来的性能下降,Ixeris 会缓存常用的 GLFW 状态,使任何线程都能快速访问,而无需将调用转发到主线程。这些缓存是安全的,不会引入额外的延迟。
增强型帧率限制器
原版的帧率限制器(26.1 之前)存在缺陷,它使用 glfwWaitEventsTimeout 进行休眠。然而,该函数无法在渲染线程中调用,因此在 Ixeris 下无法发挥最佳效果。
Ixeris 以混合方式重写了帧率限制器:先进行精确休眠,并在剩余等待时间很短时切换为自旋等待。
术语表
- 主线程是游戏启动时所在的线程。大多数 GLFW 函数都必须在此线程上调用,它还负责事件轮询。
- 渲染线程负责游戏通常所做的一切工作,事件轮询除外。
在原版 Minecraft 中,这两个术语指的是同一个线程。
常见问题
Ixeris 支持哪些 Minecraft 版本?
Ixeris 支持 Minecraft Java 版 1.16.5–26.3,共 28 个版本,可用的加载器:Fabric / Forge / NeoForge / Quilt。下载时注意选择和你游戏版本一致的文件。
Ixeris 怎么安装?
先用 PCL2 或 HMCL 启动器安装对应版本的 Fabric / Forge / NeoForge / Quilt,再把下载的 .jar 文件放进游戏目录的 mods 文件夹,重新启动游戏即可。开启了版本隔离的,mods 文件夹在 versions/版本名 下面。
评论
登录后评论和评分