【发布时间】:2024-04-18 05:35:01
【问题描述】:
我试图了解为什么在将图像绘制到 HTML5 画布时,内存会继续在 Chrome(版本 38.0.2125.111)中累积。使用下面的代码,我在 Chrome 的任务管理器中看到我的标签的“内存”数字以每秒约 300-400kb 的速度增长到 35mb 到 50mb 之间的任何地方,然后下降到大约 5mb。在那之后发生一次,随着过程的继续,记忆只会不断攀升和攀升(即它似乎永远不会再次被清除)。如果我再次单击“开始”,或者即使我刷新页面,内存也不会下降。
<!DOCTYPE HTML>
<html>
<head>
<script type="text/javascript">
function tryit () {
var px=1;
var py=1;
var canvas = document.getElementById('myCanvas');
var context = canvas.getContext('2d');
var canvas2 = document.getElementById('myCanvas2');
var context2 = canvas2.getContext('2d');
var img=document.getElementById("img1");
var thereps=document.getElementById("txtreps").value;
context2.drawImage(img,0,0);
var counter=1;
function loop() {
counter=counter+1;
px=Math.random()*1000;
py=Math.random()*800;
context.drawImage(canvas2, 0, 0, 10, 16, px,py,10,16);
if (counter>=thereps) {
clearInterval(myTimer);
context.clearRect(0,0,1034,814);
alert("done");
}
}
myTimer = setInterval(loop,17);
}
</script>
</head>
<body>
Loop:
<input id="txtreps" type="text" size="6" value="10000"/>
times
<input type="button" onclick="tryit();" value="Go"/>
<div style="position:relative;width:1034px;height:814px;border:1px solid grey;">
<canvas id="myCanvas" width="1034" height="814" style="visibility: visible; position: absolute; top:0; left: 0;border:1px solid black;" ></canvas>
<canvas id="myCanvas2" width="10" height="16" style="visibility: hidden;position:absolute; left:0px; top:0px;border:1px solid red;" ></canvas>
<img id="img1" src="untitled.png" width="10" height="16" style="visibility: hidden; position: absolute; top:0; left: 0;border:1px solid green;">
</div>
</body>
</html>
这是我的大型应用程序如何运行的一个微型示例。用户输入触发动画开始,它们通常运行最多 5 秒然后停止。然后用户再次输入以开始另一个动画。这可以重复数百次。随着我的图像越来越多,我发现内存以每秒 3-4mb 的速度增加,不久我就遇到了 Aw Snap 错误,因为内存已经超过 1.4gb。难道我做错了什么?有什么方法可以强制执行浏览器似乎只经常应用一次的“清理”过程?
请注意,当我使用 requestAnimationFrame 而不是计时器设置循环时,我发现即使我实际上没有绘制任何东西(即我没有进行 drawImage 调用),内存也会增加。
【问题讨论】:
-
我认为你是对的(参考我现在删除的答案),这很可能是当前版本中的一个错误。您可以自己回答并标记为正确答案。
标签: javascript html memory canvas