มีปัญหาเกี่ยวกับหน่วยความจำในแอปพลิเคชั่น flutter หรือไม่?


9

ฉันมีปัญหาเกี่ยวกับหน่วยความจำด้วยแอพพลิเคชั่นกระพือเมื่อใช้การคำนวณฉันใส่บรรทัดนี้ในพารามิเตอร์ฟังก์ชั่นในการคำนวณ:

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

วิธีการคำนวณคืออะไร? imglib คืออะไร คุณช่วยเพิ่มรายละเอียดเพิ่มเติมหน่อยได้ไหม?
Igor Kharakhordin

คุณสามารถอ่านวิธีการคำนวณได้ที่นี่: api.flutter.dev/flutter/foundation/compute.htmlนั่นไม่ใช่ฟังก์ชั่นการใช้งานของฉันฉันแค่ใช้มัน imglib เป็นแพคเกจภาพ: pub.dev/packages/image ขออภัย @IgorKharakhordin ที่ไม่ดีของฉัน
hoangquyy

1
ฉันคิดว่าvar imageในบรรทัดแรกของการgetCropImage(...)ไม่ปล่อยหลังจากการใช้งานดังนั้นลองใช้var imageเป็นเขตข้อมูล (เพื่อไม่จัดสรรหน่วยความจำใหม่เสมอ) อาจมีประโยชน์ที่จะไม่สร้างอินสแตนซ์ var ใหม่ในทุกขั้นตอนวนรอบ! พยายามนำวัตถุประเภทนี้กลับมาใช้ซ้ำโดยเฉพาะเมื่อคุณจัดการกับวัตถุขนาดใหญ่เช่นรูปภาพ โดยทั่วไปตัวเก็บขยะไม่รับประกันว่าจะปล่อยวัตถุที่ไม่ได้ใช้งานทั้งหมด และจำไว้ว่าอย่าโทรSystem.gc() หรือวิธีอื่นใดที่คล้ายกันโดยตรง (เพื่อบังคับให้ยกเลิกการจัดสรรหน่วยความจำ) นั่นเป็นอาการของรหัสที่ไม่สมบูรณ์และไม่ได้รับการปรับปรุงให้ดีที่สุด :)
Roberto Manfreda

คำตอบ:


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

แต่ฉันไม่สามารถเห็นหน่วยความจำออกจากการควบคุม ดังนั้นคุณอาจมีสิ่งอื่นเกิดขึ้น


คุณตรวจสอบหน่วยความจำในโหมดโปรไฟล์หรือไม่? คุณใช้เวอร์ชั่นกระพือรุ่นใด? ฉันไม่แน่ใจ แต่อาจมาจากเวอร์ชั่นกระพือ มีคนมีปัญหาเช่นเดียวกับฉัน: - stackoverflow.com/questions/57826962/…
hoangquyy

และที่นี่: stackoverflow.com/questions/55695119/…
hoangquyy

ดังนั้นฉันคิดว่าปัญหาไม่ได้มาจากรหัสของฉัน ฉันใช้วิธีอื่นเพื่อแก้ไขปัญหานี้ แต่ไม่ได้ใช้ isolate อีกต่อไป อย่างไรก็ตามเป็นการดีที่จะแก้ไขปัญหาหน่วยความจำนี้ขอบคุณ
hoangquyy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.