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에는 이미지 패키지가 있습니다.

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

내가 이것을 부를 때마다 기억은 계속 자랍니다.


더 많은 코드를 공유 할 수 있습니까? 특히 계산 방법.
Esen Mehmet

편집에 코드를 추가하고 확인하십시오. 답장을 보내 주셔서 감사합니다. @EsenMehmet
hoangquyy 19

계산 방법이란 무엇입니까? imglib는 무엇입니까? 더 자세한 내용을 추가 할 수 있습니까?
Igor Kharakhordin

여기에서 계산 방법을 읽을 수 있습니다 : api.flutter.dev/flutter/foundation/compute.html , 그것은 내 구현 기능이 아니며 그냥 사용합니다. imglib는 Image : pub.dev/packages/image 패키지 입니다. 죄송합니다 내 나쁜 @IgorKharakhordin
hoangquyy

1
필자 var image는 첫 번째 줄 getCropImage(...)에서 사용 후 릴리스되지 않으므로 var image필드를 사용하여 시도하십시오 (항상 새로운 메모리를 할당하지 않기 위해), 모든 루프 단계에서 새 var를 인스턴스화하지 않는 것이 유용 할 수 있습니다! 특히 이미지와 같은 큰 객체로 관리 할 때는 항상 이러한 유형의 객체를 재사용하십시오. 일반적으로 가비지 수집기는 사용되지 않은 모든 개체를 해제한다고 보장하지는 않습니다. 또한 System.gc() 메모리 할당을 강제로 해제하기 위해 직접 또는 유사한 메소드를 호출 하지 마십시오. 이는 코드가 깨지거나 최적화되지 않은 증상입니다. :)
Roberto Manfreda

답변:


0

샘플로 재현하기 위해 UI에서 이미지를 변환해야했습니다.

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 2014
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.