Update: Firefox 40 起已经默认启用 Linux 下的 OMTC 支持(见这篇开发博客),无需再按照本文说明强制手动开启。

UPDATE: 发现开启 layers.offmainthreadcomposition.async-animations 会导致右键菜单无法响应鼠标位置,必须使用键盘控制。推荐关闭。 (Fixed)

最近在玩儿一些 HTML5 游戏的时候发现我的 Firefox 图形渲染似乎比之前卡了很多。明明很早之前就强制开启了硬件加速却没觉得有效果。在 about:support 中一看,“GPU 图像加速窗口”竟然又变成了 0/1 Basic ,虽然下面的“WebGL 渲染器”正确识别到了我的 Intel 集显。根据文档,这说明部分启用了硬件加速,但由于不支持硬件合成器,所以事实上是把内容交给显卡计算后再读取出来显示。

搜索一番,看到这篇博客: No more main-thread OpenGL in Firefox (important note for Linux users who use OpenGL) 。才知道原来从去年开始, Firefox 正式将 OpenGL 合成从主线程移出来了。虽然 Off Main Thread Compositing (OMTC)已经实验了很长时间(搜索一下就可以看到不少 2012 年的记录),但在 Linux 上还是存在问题,所以就默认关闭,导致 Linux 无法使用硬件加速合成。

解决方法很简单——首先需要按照旧办法强制开启硬件加速绕过黑名单,然后再开启试验性的 OMTC 支持:设置 MOZ_USE_OMTC=1 环境变量(可以修改 firefox.desktop 文件,将 Exec 设置为 env MOZ_USE_OMTC=1 /usr/lib/firefox/firefox %u ,注销重新登录以生效),并且在 about:config 中打开以下几个选项:

  • layers.acceleration.force-enabled (就是上篇文章中提到的关键设置)
  • layers.offmainthreadcomposition.enabled
  • layers.offmainthreadcomposition.testing.enabled
  • layers.offmainthreadcomposition.async-animations
  • layers.async-video.enabled (这个应该是默认打开的)

当然, layers.acceleration.disabled 应该是关闭的(也就是在 GUI 设置界面中勾选上自动使用硬件加速)。最后,通过禁用 XRender 还可以进一步获取一点性能提升(关闭 gfx.xrender.enabled 选项)。

完成后在 about:support 中应该看到这样的信息:“GPU 加速窗口: 1/1 OpenGL (OMTC)”。

提示:我在开启 OMTC 时遇到过一次段错误浏览器崩溃, bug tracker 中也有包括渲染错误、崩溃在内的不少问题,请谨慎尝试并尽量使用最新内核和驱动。