Невозможно отобразить 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
}
})
Я надеюсь, что это помогает кому-то.