艾谢丽斯是一个优化事件轮询以提升客户端性能的模组。
艾谢丽斯 概述 艾谢丽斯是一个优化事件轮询以提升客户端性能的模组。 你可能已经注意到,当你移动鼠标时,帧率会出现可见的下降。帧率下降的一部分原因是,当你转动视角时,游戏确实需要执行额外的任务,例如计算区块的可见性。然而,由于原生代码中事件轮询的低效性以及 JNI 向上调用(upcall)的开销,部分本可用于渲染的 CPU 时间被不必要地耗费在了事件轮询上。在 Windows 系统上,尤其是当你的鼠标具有高采样率时,这一问题最为明显。 艾谢丽斯主要通过以下两项措施来解决该问题: 线程化事件轮询 与在同一线程上执行渲染和事件轮询不同,艾谢丽斯在 主线程 上执行事件轮询,并将渲染任务分发至独立的 渲染线程 . 缓冲原始输入 (仅限 Windows)。将用于输入轮询的方法从低效的 GetRawInputData (每个输入事件一次调用)切换为 GetRawInputBuffer ,允许批量读取原始输入消息(所有事件仅需一次调用)。此外,在 Java 代码中执行此工作使我们能够消除 JNI 向上调用的开销。 基准测试 这些测试在世界完全加载且帧率稳定后进行。 测试 1:游戏内 此测试比较鼠标被捕获(即光标不可见)时的性能。测试在一个没有实体的超平坦世界中进行。 此测试在 Windows 上进行,在该系统上艾谢丽斯默认使用缓冲原始输入以提升性能。“Ixeris, Non-buffered”列显示了禁用该选项时的帧率。 采样率 无艾谢丽斯 艾谢丽斯,非缓冲 艾谢丽斯,缓冲 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.24x) Linux (X11) 358 FPS 320 FPS 355 FPS (1.11x) Linux (Wayland) 364 FPS 289 FPS 298 FPS (1.03x) 技术细节 线程安全 在当前的状态下,Ixeris 不应破坏线程安全。通过 glfwSet*Callback 注册的回调在渲染线程上执行。对必须在主线程上调用的 GLFW 函数的调用,如果在其他线程上进行,将被分发到主线程。如果这些调用可以安全地延迟,它们可能会立即返回,否则可能会阻塞调用者,直到调用完成。 从版本 3.1.0 开始,严格遵循 GLFW 文档中关于线程安全的要求。 GLFW 状态缓存 大多数 GLFW 函数要求从主线程调用。然而,许多模组可能会从渲染线程调用它们。为了避免线程通信带来的性能下降,Ixeris 缓存了常用的 GLFW 状态,以便从任何线程快速访问,而无需将调用路由到主线程。这些缓存是安全的,不会引入额外的延迟。 增强型 FPS 限制器 原版 FPS 限制器(26.1 版本之前)存在缺陷,使用 glfwWaitEventsTimeout 进行休眠。然而,此函数不能从渲染线程调用,因此与 Ixeris 配合使用时无法达到最佳效果。 Ixeris 以混合方式重写 FPS 限制器,精确休眠,并在等待时间非常短时启动自旋等待。 术语表 “ 主线程 ”是游戏启动所在的线程。大多数 GLFW 函数要求在此线程上调用,它负责事件轮询。 “ 渲染线程 ”执行游戏通常执行的所有操作,除了事件轮询。 这两个术语在原版 Minecraft 中是同义词。
在鱼乐云资源中心浏览该资源,登录后可一键安装到你的游戏服务器。