跳到正文

Ixeris

作者:decce

缓冲原始输入并在线程中轮询事件

收藏

介绍

介绍由机器翻译自 CurseForge 原页面,仅供参考。

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/版本名 下面。

评论

登录后评论和评分

decce 的其他作品

查看全部 →