Невозможно отобразить WebGL в Electron с помощью Xvfb

Я пытаюсь отобразить мое приложение, которое имеет зависимость WebGL в Electron, на моем ПК с Linux, но на странице ничего не отображается, кроме цвета фона CSS. Когда я удаляю зависимость WebGL, то есть MapboxGL, тогда все отображается нормально.

Я использую X Virtual Frame Buffer, который кажется необходимым для среды Linux, как описано здесь: https://electronjs.org/docs/tutorial/testing-on-headless-ci

Я запускаю Xvfb с помощью этой команды:

Xvfb :99 -screen 0 1024x768x24 > xvfblog.txt 2>&1 &

И тогда я запускаю свое приложение с префиксом:

DISPLAY=:99

так что приложение подключается к дисплею X Virtual Frame Buffer.

Я не уверен, что это актуально, но Xvfb запускается со следующими сообщениями:

Компилятор таблицы ключей XKEYBOARD (xkbcomp) сообщает:

> Предупреждение: неподдерживаемый код высокого ключа 372 для имени игнорируется

> X11 не может поддерживать коды клавиш выше 255.

> Это предупреждение отображается только для первого высокого кода ключа.

> Внутренняя ошибка: не удалось разрешить keysym XF86WWAN

> Внутренняя ошибка: не удалось разрешить keysym XF86RFKill

> Внутренняя ошибка: не удалось разрешить keysym XF86Keyboard

Ошибки от xkbcomp не являются фатальными для X-сервера

Я также заметил, что, когда я тестирую свое приложение с помощью Electron на Macbook, Xvfb не требуется, и мое приложение WebGL отображается очень хорошо.

Я немного озадачен здесь. Есть ли какие-либо предложения о том, что может быть не так, или что я могу исследовать для исправления?

1 ответ

Решение

Мне удалось решить эту проблему, настроив Xvfb для работы с WebGL следующим образом:

Xvfb :99 -screen 0 1024x768x24 +extension GLX +render > xvfblog.txt 2>&1 &

Где я добавил +extension GLX +render флаги.

Я также должен был начать электрон с ignore-gpu-blacklist флаг. Я нашел эту статью полезной с этим: https://medium.com/social-tables-tech/how-we-test-webgl-on-continuous-integration-37a1ead55fd7

Также обратите внимание, что я использую пакет "Electron" npm, и мне пришлось добавить следующие флаги BrowserWindow объект:

const win = new BrowserWindow({
  show: false,
  webPreferences: {
    webgl: true,
    webSecurity: false,
    experimentalFeatures: true,
    experimentalCanvasFeatures: true,
    offscreen: true
  }
})

Я надеюсь, что это помогает кому-то.

Другие вопросы по тегам