2014-12-04 5 views
0

Я главный программист библиотеки javascript/canvas 2d. Чтобы предоставить возможность кэшировать некоторый контент, я реализовал систему кеша на основе холста. Каждый DisplayObject имеет свой собственный холст, чтобы кэшировать его рендеринг.HTML5 Ошибка утечки холста при изменении размера

Основная проблема заключается в том, что я обнаружил утечку памяти при изменении размера холста. Я написал 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

Что заставляет вас думать, что у вас есть утечка памяти? Я запустил пару профилей с отладчиком Chrome на вашем jsfiddle и ничего не заметил. – mtoor

ответ

0

Удерживая браузер занятым, изменив размер холста на в то же время, вы в то же время предотвращаете GC (Garbage Collection), чтобы выполнять свою работу, удаляя эти нерезервированные выделения памяти.

Дайте браузеру немного дышать (пользователь на мобильном устройстве с батарейным питанием также оценят это). Если вам постоянно нужно изменять размер холста вместо повторного использования/совместного использования, вы можете подумать о том, чтобы немного изменить шаблон кода, поскольку это указывает на недостаток дизайна, а не на браузер. Мои 2 цента.

Смежные вопросы