【问题标题】:HTML5 canvas is flickering in Google ChromeHTML5 画布在 Google Chrome 中闪烁
【发布时间】:2021-01-10 13:18:02
【问题描述】:

似乎谷歌浏览器的更新搞砸了我的画布渲染。 我有一个非常简单的代码,可以在画布上呈现图像和文本:

var onDraw = function() {
  context.clearRect(0, 0, 256, 256);
  context.drawImage(image, 0, 0, 256, 256);
  context.fillText('TEST', 0, 20);
  
  requestAnimationFrame(onDraw);
};

此代码在 Chrome 上非常闪烁:https://jsfiddle.net/gp9jxn6q/(只需将鼠标移到页面上)。

我发现只有两种方法可以防止这种行为:

  1. 请致电context.clearRect() 获取整个画布。但在这种情况下,我不能只重绘脏矩形。
  2. 为画布设置image-rendering: pixelated。在这种情况下,所有字体看起来都很糟糕。

这还能做什么?

【问题讨论】:

  • 在我的 chrome (Macos) 上不闪烁
  • 对我来说也不闪烁(Chrome 85、MacOS)。基于提供的代码的问题:你为什么使用 requestAnimationFrame ?绘制图像和文本一次并保持原样。
  • @David 它在我电脑上的 Chrome/Windows 中闪烁。
  • 这个问题似乎只存在于windows和android上。 @David 这只是说明问题的一个例子。
  • PS:您的 jsfiddle 仅在 http 上通过 https 协议对我不起作用。图像无法加载。

标签: javascript html google-chrome canvas flicker


【解决方案1】:

这是一个自 Chromium 版本 83 以来开始更频繁出现的错误,自 85 版本以来更频繁出现(因此除了 Chrome 之外,这也会影响 Opera 和新的 Edge)。 几个月前我在 Chromium 提交了一个问题,他们目前正在修复: https://bugs.chromium.org/p/chromium/issues/detail?id=1092080

在 drawImage() 调用之后的下一个监视器帧中,抗锯齿设置为“最近邻”。这会影响源元素和目标元素,这会影响任何 CanvasImageSource(图像、视频、画布:https://developer.mozilla.org/en-US/docs/Web/API/CanvasImageSource)。

它是随机发生的,因为它可能与设备的性能和时间有关,因为某些图形设置可以修复错误,同时它们可以在另一台设备上创建错误。

但我也有一些好消息。我想我终于找到了一个可以在 drawImage() 调用重置抗锯齿后执行的解决方法:http://jsfiddle.net/u7k5qz2p/

    <div class="chromium-issue-1092080-workaround__wrapper">
        <canvas id="canvas" width="300" height="300"></canvas>
        <div class="chromium-issue-1092080-workaround__overlay"></div>
    </div>
    context.drawImage(image, 0, 0, 256, 256);
    chromiumIssue1092080WorkaroundOverlay.style.transform = `scaleX(${Math.random()})`

它的作用是在画布上覆盖一个 div。并且在每次 drawImage() 调用更改变换样式中的 scaleX 以触发画布中抗锯齿设置的重置。

【讨论】:

  • 在升级 android chrome 85.0.4183.127 后,我在 html 画布上出现了错误。 stackoverflow.com/questions/64244545/…
  • 奇怪的是,Chrome 中的错误被标记为已修复,但我仍然看到这个问题。但是,您的建议仍然可以解决我的问题。
猜你喜欢
  • 2011-08-06
  • 2013-08-27
  • 2013-03-25
  • 1970-01-01
  • 2015-01-05
  • 2012-03-03
  • 2015-09-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多