Skip to content

26.2: клиент падает на 4-м открытии GUI — Texture view has been closed (preload-пул браузеров Rinku) #31

Description

@KoSHeroff

Симптом

На 26.2-neoforge клиент падает после нескольких открытий/закрытий GUI:

java.lang.IllegalStateException: Texture view Sampler0 (MCEF Browser Texture 1x1) has been closed!
	at com.mojang.blaze3d.opengl.GlCommandEncoder.trySetup(GlCommandEncoder.java:694)
	at com.mojang.blaze3d.opengl.GlCommandEncoder.executeDraw(GlCommandEncoder.java:520)
	at com.mojang.blaze3d.opengl.GlRenderPass.drawIndexed(GlRenderPass.java:153)
	at net.minecraft.client.gui.render.GuiRenderer.executeDraw(GuiRenderer.java:405)
	at net.minecraft.client.gui.render.GuiRenderer.executeDrawRange(GuiRenderer.java:212)
	at net.minecraft.client.gui.render.GuiRenderer.draw(GuiRenderer.java:184)
	at net.minecraft.client.gui.render.GuiRenderer.render(GuiRenderer.java:124)
	at net.minecraft.client.renderer.GameRenderer.render(GameRenderer.java:447)
	at net.minecraft.client.Minecraft.renderFrame(Minecraft.java:1328)

Рендер связывает текстуру браузера, которая уже закрыта, и это валит весь клиент,
а не только GUI. Вероятно, это же лежит в основе жалоб вида «после нескольких
открытий GUI перестаёт открываться».

Причина: preload-пул браузеров у Rinku

Установлено A/B-прогонами. Переключается ровно одной настройкой в
config/mcef/mcef.properties:

Условие Результат
browser-preload-enabled=true (дефолт), закрытие через 150 мс краш на 4-м цикле
browser-preload-enabled=true (дефолт), закрытие через 3000 мс краш на 4-м цикле
browser-preload-enabled=false, закрытие через 800 мс 12/12 выжил

Два вывода из этой таблицы:

  1. Это не гонка по времени. Задержка перед закрытием роли не играет — краш
    наступает на одном и том же цикле при 150 мс и при 3000 мс. Значит дело в
    счётчике, а не в тайминге, и первоначальная версия про отложенный
    GuiRenderer как первопричину неверна: отложенный рендер лишь то место, где
    закрытая текстура обнаруживается.
  2. Пул — необходимое условие. С выключенным preload краш не воспроизводится.

Размеры пула в дефолтном конфиге — по одному на тип:

browser-preload-enabled=true
browser-preload-opaque-pool-size=1
browser-preload-transparent-pool-size=1

1x1 в тексте ошибки — это плейсхолдерный размер текстуры браузера до первой
отрисовки, то есть в рендер попадает инстанс из пула, чья текстура уже закрыта.

Где не воспроизводится

Таргет Rinku Результат
1.21.11-fabric 2.2.0 60/60 циклов, чисто
26.1.2-neoforge 2.2.0 12/12 циклов, чисто
26.2-neoforge 2.2.1 краш на 4-м цикле

Развести «баг MC 26.2» и «баг Rinku 2.2.1» на 2.2.x невозможно: сборки
2.2.0 под 26.2 не существует, для 26.2 опубликована только 2.2.1, а 2.2.0
последняя под 26.1.1.

При этом 3.0.4 есть и под 26.1.2, и под 26.2. Так что #28 (миграция на Rinku
3.0.4) — единственный способ получить одинаковую версию Rinku на обеих линиях
26, и вполне возможно, что она же и фиксит этот краш. Проверить это без
миграции нельзя: 3.0.0 ломает API, WebGUI против него не соберётся.

Важно про метод закрытия

Баг видно только если закрывать GUI так, как это делает игрок — через
закрытие экрана, отдав уборку самому WebGUI. Если в цикле вызывать
WebSession.closeGuiAndRestoreHud() напрямую, тест делает уборку за модом и
проходит зелёным всегда. Первый прогон стресса именно так и обманул меня: 40/40
на 1.21.11 при неверном пути закрытия.

Обходной путь

Пользователям на 26.2 — в config/mcef/mcef.properties:

browser-preload-enabled=false

Ценой чуть более медленного первого открытия.

Воспроизведение

Стендом из mc-webgui/testkit (приватный репозиторий):

node mcp/repro-texture-26.mjs 26.2-neoforge 800 12

Прогон поднимает dev-клиент, открывает страницу как GUI, закрывает экран и
повторяет, отслеживая краш в логе клиента.

Что сделать

  • Решить, чинится ли это на стороне WebGUI (не отдавать в рендер браузер с
    закрытой текстурой / не закрывать браузер, пока кадр с ним в батче) или
    это баг Rinku, который надо заводить у Keksuccino
  • Проверить, снимается ли краш на Rinku 3.0.4 — увязать с Мигрировать на Rinku 3.0.4 (ломающее обновление MCEF) #28
  • Добавить в CI стресс открытия/закрытия GUI, чтобы это не вернулось

Activity

  1. KoSHeroff commented on Sep 8, 2026

    @KoSHeroff
    MemberAuthor

    Исправляется апгрейдом до Rinku 3.0.4 — #32. На 3.0.4 тот же цикл проходит 25/25 с включённым preload-пулом, обходной путь с browser-preload-enabled=false больше не нужен.

    Попутно там же вскрылось, что CefUtilMixin подмешивал в CefApp.startup удалённый из Chromium флаг --use-gl=desktop: на старом Chromium он проходил незамеченным, на Chromium 151 из Rinku 3 валит инициализацию CEF целиком.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions