年华の博客

全部文章 运维

No.019 分类运维

标签 selenium / WebGL / headless / 截图

  • 418 字
  • 约 2 分钟

headless Chrome 截图 WebGL 黑块问题排查

友链截图工具在 headless Chrome 下遇到 Spline/Live2D 站点渲染失败、出现带报错信息的黑块,通过启用 swiftshader 软件渲染解决。

起因

维护友链检测工具 check-flink(Selenium + headless Chrome 截取友链主页并上传图床)时发现:部分友链站点使用了 Spline 或 Live2D 这类 WebGL 内容,截出来的图对应区域是一块纯黑色,黑块里还带着 WebGL 初始化失败的报错信息,非常难看。

原因分析

headless Chrome 在无 GPU 环境下默认禁用 WebGL 渲染。站点通过 WebGL 绘制的 3D/动画内容无法初始化,页面就只剩下一块黑色区域(有时带报错提示)。之前截图工具的 Chrome 启动参数里是 --disable-gpu,等于直接关掉了 GPU 相关的所有能力。

解决方案

Chrome 支持通过 SwiftShader 做 WebGL 的软件渲染——没有 GPU 也能用 CPU 模拟渲染出 WebGL 内容。改动 screenshot.py 里的 Chrome 启动参数:

options = Options()
options.add_argument("--headless=new")
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")
# WebGL 软件渲染(Spline/Live2D 等 WebGL 内容在 headless 下默认不渲染,产生黑块)
# 新版 Chrome 需要 --enable-unsafe-swiftshader 才允许软件 WebGL
options.add_argument("--use-gl=angle")
options.add_argument("--use-angle=swiftshader")
options.add_argument("--enable-unsafe-swiftshader")
options.add_argument("--ignore-gpu-blocklist")
options.add_argument("--disable-extensions")
options.add_argument("--disable-software-rasterizer")
options.add_argument(f"--window-size={WINDOW_WIDTH},{WINDOW_HEIGHT}")

关键点:

  • 移除 --disable-gpu,它会把 GPU 相关能力整个关掉
  • --use-gl=angle + --use-angle=swiftshader:ANGLE 层之上跑 SwiftShader 软件实现
  • --enable-unsafe-swiftshader:新版 Chrome 的必需参数,没有它软件 WebGL 依然不允许启用
  • --ignore-gpu-blocklist:忽略对软件渲染器的黑名单限制

验证

改完后对含 WebGL 内容的友链站点重新截图,Spline / Live2D 内容可以正常渲染,黑块消失。磁盘没有独立 GPU 的 CI 环境(GitHub Actions / 国内流水线)同样适用。

备注

  • 该修复已通过 PR 提交到上游项目:check-flink
  • 此方案是”尽力”渲染:个别站点可能仍有兼容性问题,必要时可再叠加截图后黑区检测兜底
  • 如果遇到 WebGL 内容加载慢,可适当调大截图前的等待时间(PAGE_LOAD_WAIT)

License 版权

本文《headless Chrome 截图 WebGL 黑块问题排查》由 年华 写,按 CC BY-NC-SA 4.0 协议发布。可以转载,但要署名、不能商用,改过的内容也按同样的协议发布。

https://tblog.amamo.top/posts/headless-chrome-webgl-black-block/

Nearby上下篇

  1. No.020 vercel优化冷知识 194 字
  2. No.018 Vercel 部署后全站 404 排查记 1,762 字

Comments评论