2014-12-04 58 views
0

我是基于JavaScript/canvas 2d库的主程序员。 为了提供缓存某些内容的可能性,我实现了基于画布的缓存系统。每个DisplayObject都有自己的画布以缓存他的渲染。HTML5 Canvas内存泄漏调整大小

这里的主要问题是,我检测到画布大小调整时出现内存泄漏。 我写了一个jsfiddle说明了这个问题。

function draw() 
{ 

    var canvas = document.getElementById("tomahawk"); 
    var context = null; 

    canvas.width = parseInt(Math.random() * 800); 
    canvas.height = parseInt(Math.random() * 600); 

    context = canvas.getContext("2d"); 

    context.clearRect(0,0,canvas.width,canvas.height); 
    context.save(); 
    context.beginPath(); 
    context.fillStyle = "red"; 
    context.fillRect(0,0,canvas.width,canvas.height); 
    context.fill(); 
    context.restore(); 

    window.requestAnimationFrame(draw); 
} 

window.requestAnimationFrame = (function() 
{ 

    return window.requestAnimationFrame  || //Chromium 
      window.webkitRequestAnimationFrame || //Webkit 
      window.mozRequestAnimationFrame || //Mozilla Geko 
      window.oRequestAnimationFrame  || //Opera Presto 
      window.msRequestAnimationFrame  || //IE Trident? 
      function(callback, element){ //Fallback function 
       window.setTimeout(callback, parseInt(1000/60));     
      } 

})(); 

draw(); 

有人有线索吗?你知道为什么调整一个高频率的画布造成内存泄漏吗?主要的问题是,我不能以另一种方式做到这一点,我需要找到答案或黑客以释放内存......

+0

是什么让你觉得你有内存泄漏?我在你的jsfiddle上用Chrome调试器运行了一些配置文件,但没有注意到任何明显的问题。 – mtoor 2014-12-04 22:08:27

回答

0

通过调整画布大小来保持浏览器繁忙一个紧密的循环可能会阻止GC(垃圾收集)完成其工作,并删除那些未引用的内存分配。

给浏览器一些喘口气(手机电池驱动设备上的用户也会赞赏这一点)。如果您经常需要调整画布大小而不是重复使用/共享画布,则应该考虑稍微更改一下代码模式,因为这表示设计缺陷,而不是浏览器。我的2美分..