
Chat Lag Fix
Активный0.0
Установок
Последнее обновление
Версии
Chat Lag Fix - Устранение лагов чата в Minecraft
Этот мод решает проблему зависаний клиента 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-запрос в потоке рендеринга для проверки вашего списка заблокированных игроков. Текущий кадр не завершает отрисовку до окончания этого запроса, что вызывает резкое падение производительности. Данный мод пропускает сообщения чата до тех пор, пока не будет получен список блокировок.
Причины возникновения проблемы
Почему эта проблема появилась сейчас, а не раньше? Изменения произошли в API Mojang. При входе в мир список блокировок обычно загружался нормально, но API Mojang начал возвращать ошибки для пользователей, перешедших на учетные записи 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 (/ исключение /) { // При ошибке возвращаем null return null; } }
Если вы хотите самостоятельно изучить исходный код, обратитесь к com.mojang.authlib.yggdrasil.YggdrasilUserApiService, помня, что эти методы вызываются в потоке рендеринга, блокируя завершение отрисовки кадра.
GIF демонстрация проблемы
