Czy występuje problem z pamięcią związany z izolowaniem w aplikacji trzepotania?

9

Mam problem z pamięcią z aplikacją trzepotania, podczas korzystania z obliczeń wstawiam ten wiersz w parametrze funkcji w obliczeniu:

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

I uruchom go w pętli, pamięć ciągle rośnie, a następnie brak pamięci, a aplikacja uległa awarii.

Jeśli nie mam tej linii, pamięć jest stabilna przy 40 MB. Myślę więc, że w obliczeniach nie zostało wyczyszczone po zakończeniu funkcji obliczeń.

Czy ktoś ma ten sam problem?

Edytować:

Oto jak implementuję obliczenia:

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

W 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());
}

Z imglib jest pakiet Image:

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

Za każdym razem, gdy to nazywam, pamięć się powiększa.

hoangquyy
źródło
Czy możesz udostępnić więcej kodu? Zwłaszcza metoda obliczeniowa.
Esen Mehmet
Dodałem kod w edycji, sprawdź go. Dziękuję za odpowiedź. @EsenMehmet
hoangquyy
Co to jest metoda obliczeniowa? Co to jest imglib? Czy możesz dodać więcej szczegółów?
Igor Kharakhordin
Możesz przeczytać metodę obliczeniową tutaj: api.flutter.dev/flutter/foundation/compute.html , to nie jest moja funkcja implementująca, po prostu jej używam. imglib to pakiet Image: pub.dev/packages/image . Przepraszam mój zły @IgorKharakhordin
hoangquyy
1
Myślę, że var imagew pierwszym wierszu getCropImage(...)nie ma wydania po użyciu, więc spróbuj użyć var imagejako pola (aby nie przydzielać zawsze nowej pamięci), może być użyteczne, aby nie tworzyć nowej zmiennej na każdym kroku pętli! Zawsze staraj się ponownie wykorzystywać tego typu obiekty, zwłaszcza gdy zarządzasz dużymi obiektami, takimi jak obrazy. Ogólnie śmieciarz nie gwarantuje uwolnienia wszystkich nieużywanych obiektów. I pamiętaj, że nigdy nie wywoływaj System.gc() bezpośrednio lub podobnych metod (w celu wymuszenia zwolnienia pamięci), jest to objaw zepsutego i niezoptymalizowanego kodu. :)
Roberto Manfreda

Odpowiedzi:

0

Aby spróbować odtworzyć z twoją próbką, musiałem najpierw przekonwertować z interfejsu użytkownika.

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;
}

Uruchom uproszczoną wersję swojej próbki:

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;
}

Ale nie byłem w stanie zobaczyć, jak pamięć wymyka się spod kontroli. Więc prawdopodobnie dzieje się coś innego.

TWL
źródło
Czy sprawdziłeś pamięć w trybie profilu? Z jakiej wersji trzepotania korzystasz? Nie jestem pewien, ale może pochodzi z wersji trzepotania. Ktoś ma taki sam problem jak ja: - stackoverflow.com/questions/57826962/…
hoangquyy
Myślę więc, że problem nie pochodzi z mojego kodu. Użyłem innego sposobu rozwiązania tego problemu, ale nie używałem już izolacji. Jednak dobrze jest rozwiązać ten problem z pamięcią, dziękuję.
hoangquyy