2

我想用 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 fps 更新。这个内存泄漏是当前飞镖实现中的一个错误还是我做错了什么?

4

1 回答 1

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();
}
于 2013-12-18T11:46:14.717 回答