Почему это использование утечки памяти getImageData

Я хотел бы выполнить некоторую обработку изображений с помощью Dart, используя requestAnimationFrame, чтобы постоянно обновлять изображение, которое я обрабатываю. Следующий код будет пропускать память до тех пор, пока в Dartium не произойдет сбой вкладки.

import 'dart:html';
import 'dart:async';

final CanvasElement m_canvas = querySelector("#canvas");

void main() {
  scheduleMicrotask(requestRedraw);
}

void requestRedraw() {
  if(true)
  {
    window.requestAnimationFrame(draw);
  }
}

void draw(num _) {
  var context = m_canvas.context2D;
  context.clearRect(0, 0, m_canvas.width, m_canvas.height);
  var imageData = context.getImageData(0, 0, m_canvas.width, m_canvas.height);
  requestRedraw();
}

ImageData var явно выходит из области видимости после завершения каждого вызова отрисовки, но память, которую он сохраняет, никогда не освобождается. Комментирование этой строки приводит к тому, что код работает нормально и обновляется со скоростью 60 кадров в секунду. Эта утечка памяти - ошибка в текущей реализации дротика, или я делаю что-то не так?

1 ответ

Решение

Это очень странно, но когда я добавляю print() Заявление к вашему коду, в которое вступает GC (по крайней мере, в Dartium)

int i = 0;
void draw(num _) {
  var context = m_canvas.context2D;
  context.clearRect(0, 0, m_canvas.width, m_canvas.height);
  var imageData = context.getImageData(0, 0, m_canvas.width, m_canvas.height);
  print(i++);
  requestRedraw();
}
Другие вопросы по тегам