
聊天延迟修复
修复了收到聊天消息导致的Minecraft客户端卡顿问题(适用于1.17和1.16版本)
修复接收聊天消息导致的 Minecraft 客户端卡顿
在 1.18 版本中您不再需要此模组
Mojang 已修复其 API 中的错误,该错误导致其返回错误而非空列表。Minecraft 将在加入世界时获取一次封禁列表。此模组仍可能通过减少 HTTP 请求所需的时间来改善世界加载速度,尤其是在您网络连接较慢的情况下。
Mojang 员工的评论确认此错误已修复:https://bugs.mojang.com/browse/WEB-5587?focusedCommentId=1134973&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-1134973
此错误仍影响 1.17 和 1.16 版本,但仅在收到第一条聊天消息时出现:https://bugs.mojang.com/browse/MC-218167
技术细节: 当收到聊天消息时,Minecraft 在渲染线程中发送 HTTP 请求以检查您的玩家封禁列表。当前帧必须等待此请求完成后才能完成渲染,导致卡顿尖峰。此模组允许聊天消息在获取封禁列表之前直接通过。
为什么现在会发生而不是以前?: Mojang 的 API 出了问题。加入世界时,封禁列表通常能正常加载,但 Mojang 的 API 已开始为迁移到 Microsoft 账户的用户返回错误,导致在收到消息时每 2 分钟间隔获取一次封禁列表。
对错误发生原因的逐步解析
// 代码的简化视图。 private static final long BLOCKLIST_REQUEST_COOLDOWN = 120; private Instant nextRequest; private final blockList Set;// 收到聊天消息时调用此方法 public boolean isBlockedPlayer(UUID playerID) { // 如果尚未获取封禁列表,则获取它 // 注意:当出现错误时,fetchBlockList 返回 null // if (this.blockList == null) { this.blockList = fetchBlockList(); // 如果仍未获取到,则假定玩家未被封禁 if (this.blockList == null) { return false; } } return this.blockList.contains(playerID); }
public Set fetchBlockList() { // 至少每 2 分钟检查一次。 // 这就是为什么卡顿尖峰每 2 分钟或更长时间出现一次 if (this.nextRequest == null || Instant.now().isAfter(this.nextRequest)) { return null; } // 重置 2 分钟计时器 this.nextRequest = Instant.now().plusSeconds(BLOCKLIST_REQUEST_COOLDOWN); try { // 发出 HTTP 请求 BlockListResponse response = minecraftClient.get(routeBlocklist, BlockListResponse.class); return response.getBlockedProfiles(); } catch (/* exception */) { // 如果出现错误则返回 null return null; } }
如果您想亲自查看未修改的代码,请查看 com.mojang.authlib.yggdrasil.YggdrasilUserApiService,记住这些方法在渲染线程上被调用,从而阻止画面渲染完成。
错误的 GIF 演示

正在加载版本记录…
正在加载评论…
评论在新手盒子客户端中发表,这里同步展示。