flutter应用程序中的隔离是否存在内存问题?


9

我对flutter应用程序的内存有问题,在使用计算时,我将这一行放在计算的函数参数中:

var image = imglib.Image.fromBytes(values[1].width, values[1].height, values[1].planes[0].bytes, format: imglib.Format.bgra);

并以循环方式运行它,内存每次都会保持增长,然后内存不足,应用崩溃。

如果我没有那条线,则内存稳定在40mb。因此,我认为在计算中,在计算功能完成后并没有清除它。

有人有同样的问题吗?

编辑:

这就是我实现计算的方式:

image = await compute(getCropImage, [copyFaces, streamImg]);

在getCropImage中:

Future<imglib.Image> getCropImage(List<dynamic> values) async {
  var image = imglib.Image.fromBytes(values[1].width, values[1].height, values[1].planes[0].bytes, format: imglib.Format.bgra);

  double topLeftX = values[0][0].boundingBox.topLeft.dx.round() -
  (values[0][0].boundingBox.width * 0.2);
  double topLeftY = values[0][0].boundingBox.topLeft.dy.round() -
  (values[0][0].boundingBox.height * 0.2);
  double width = values[0][0].boundingBox.width.round() +
  (values[0][0].boundingBox.width * 0.4);
  double height = values[0][0].boundingBox.height.round() +
  (values[0][0].boundingBox.height * 0.4);
  if (topLeftX <= 0) {
    topLeftX = 25;
  }
  if (topLeftY <= 0) {
    topLeftY = 25;
  }
  if ((topLeftX + width) >= values[1].width) {
    width = values[1].width - topLeftX - 25;
  }
  if ((topLeftY + height) >= values[1].height) {
    height = values[1].height - topLeftY - 25;
  }

  return imglib.copyCrop(
      image, topLeftX.round(), topLeftY.round(), width.round(), height.round());
}

带有imglib的是Image包:

import 'package:image/image.dart' as imglib;

每当我这样称呼时,记忆就在不断增长。


您可以共享更多代码吗?特别是计算方法。
Esen Mehmet

我已经在编辑中添加了代码,请签出。感谢您的回复。@EsenMehmet
hoangquyy

什么是计算方法?什么是imglib?能否请您添加更多详细信息?
Igor Kharakhordin

您可以在此处阅读计算方法:api.flutter.dev/flutter/foundation/compute.html,这不是我的实现函数,我只是使用它。imglib是软件包Image:pub.dev/packages/image。对不起我的坏@IgorKharakhordin
hoangquyy

1
我认为使用后不会释放var imagein的第一行getCropImage(...),因此请尝试使用var imageas字段(为了不总是分配新的内存),也许在每个循环步骤中不实例化新的var可能很有用!始终尝试重用这些类型的对象,尤其是在使用大对象(例如图像)进行管理时。通常,垃圾收集器不保证释放所有未使用的对象。切记,切勿System.gc() 直接调用或类似方法(以强制进行内存重新分配),这是代码破裂且未优化的症状。:)
罗伯托·曼弗雷达

Answers:


0

为了尝试使用您的样本进行复制,我必须首先从ui.Image进行转换:

Future<Uint8List> _bytePng(ui.Image image) async {
  ByteData byteData = await image.toByteData(format: ui.ImageByteFormat.rawRgba);
  Uint8List byteList = byteData.buffer.asUint8List(byteData.offsetInBytes, byteData.lengthInBytes);
  return byteList;
}

运行示例的简化版本:

imglib.Image image2 = await compute(_getImage, [image1.width, image1.height, byteList]);


Future<imglib.Image> _getImage(List<dynamic> values) async {
  var temp = imglib.Image.fromBytes(values[0], values[1], values[2], format: imglib.Format.bgra);

  var rng = new Random().nextInt(50);
  imglib.Image cropped = imglib.copyCrop(temp, 0, 0, temp.width - rng, temp.height - rng);

  return cropped;
}

但是我看不到内存失控。因此,您可能还有其他情况。


您是否在配置文件模式下检查了内存?您正在使用哪个版本的Flutter?我不确定,但也许它来自颤振版本。有人有同样的问题我: - stackoverflow.com/questions/57826962/...
hoangquyy


所以我认为问题不在于我的代码。我已经使用其他方法来解决此问题,但不再使用隔离。但是,很高兴解决此内存问题,谢谢。
hoangquyy
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.