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