Chromium内核浏览器大尺寸HTML Canvas内存泄漏问题求助
Chromium内核浏览器(Chrome/Edge)大尺寸Canvas GPU内存泄漏问题求助
我在高DPI显示器上用以下标准代码缩放Canvas以实现清晰显示:
var dpiScale = ...; // 例如 2, 2.25, 3 var width = 1500, height = 800; canvas.width = width * dpiScale; canvas.style.width = width + "px"; canvas.height = height * dpiScale; canvas.style.height = height + "px"; canvas.getContext("2d").scale(dpiScale, dpiScale);
当Canvas频繁更新(每秒数次,滚动、捏合缩放等交互时更频繁),GPU进程会大量分配内存且从不释放,很快就会崩溃。
该问题具有以下特征:
- 仅出现于Chrome和Edge,Safari、Firefox无此问题
- 似乎是近期出现或显著恶化的问题
- 与缩放后的Canvas尺寸相关,超过阈值才会触发;移除缩放(dpiScale=1)或缩小Canvas尺寸可解决
- 与特定Canvas绘图API无关,仅使用moveTo()、lineTo()、stroke()、fill()等基础API仍会出现,未使用getImageData()
目前找到两个可行的临时解决办法:
- 限制Canvas更新频率,比如改为20fps,而非使用requestAnimationFrame()
- 使用
getContext("2d", {willReadFrequently: true}),该参数会关闭硬件加速,且未带来明显CPU开销,此时GPU进程内存会在更新停止后释放
无法完全排除是显卡驱动或Chromium与驱动交互的问题,并非所有电脑都能复现。
现寻求:
- 更多相关见解
- 比
{willReadFrequently: true}更优的解决方案 - 可能被忽略的、导致泄漏的特定Canvas操作
内容的提问来源于stack exchange,提问作者user13473954
相关产品推荐
相关产品推荐

