Chromium WebView 上有关高负载导致画布上部分渲染的错误的解决方法

mic*_*ico 10 javascript android webview openlayers cordova

我在 Chrome 最新的 WebView 上发现了[1]这个问题。要生产它,您需要三件事:

  1. 您已将 WebView 更新至 2021 年 11 月 15 日版本
  2. AndroidManifest 中的 HardwareAcceleration 设置为 true
  3. 当你大量地为 webview 渲染内容时,你开始在屏幕上看到丢失的内容。

我的技术堆栈在应用程序内部使用 Openlayers 地图,该地图实际上是一个包含 Cordova 的小型网站,Cordova 是使用 WebView 的组件。

我所说的大量使用是指地图必须具有多层地图数据才能渲染,并且我必须采取一些措施来移动地图并使其在前一个渲染内容完成之前开始加载下一个渲染内容。

安装后第一次打开地图时,地图在重负载下工作正常。当我终止应用程序并再次登录并在应用程序第一次尝试渲染时做出剧烈动作时,问题就开始了。之后,地图不会整体呈现内容,某些图块和地图菜单仅部分呈现。

即使我单击一些地图图层,这种行为仍然会继续,并且当它们很少时,问题就会解决。有趣的是,没有一个点的负载足以触发问题或稳定下来,至少每个方向的点是不同的。

仅当存在问题时,logcat 才会出现一条警告消息:

chromium: [错误:tile_manager.cc(821)] 警告:超出图块内存限制,某些内容可能无法绘制

我可以观察到,2021 年 11 月 15 日版本更新删除了一些“无用数据” [2]。我不能 100% 确定这两件事是否相关,但我已经意识到该特定更新之前的版本在我的应用程序中工作得很好(我从 Google Play 中的 WebView 中删除了更新)。

目前有三种解决方法:

  1. 不要使用太重的地图图层并触发问题(通过向用户隐藏关键信息而损害我们的应用程序用户体验)
  2. 从 PlayStore 中删除 webview 更新(我亲自测试过,系统一夜之间将损坏的版本更新回来,很难与最终用户沟通)。
  3. 不使用硬件加速。(应用程序的其他部分变得毫无用处,太慢的行为会让最终用户生气)。

正如您所观察到的,这些都效果不佳。我相信其他 WebView 重度用户也会看到同样的行为,所以我只用一个主要问题来打开这个问题:

与此同时,我的错误报告正在 Google 中推进,我可以做些什么来克服这个问题?


资料来源:

[1] https://bugs.chromium.org/p/chromium/issues/detail?id=1274482

[2] https://chromium.googlesource.com/chromium/src/+/a0994781ea666d9b630b6478206ac429ed8444d1%5E%21/#F0