Saya memiliki masalah tentang memori dengan aplikasi flutter, ketika menggunakan compute, saya menempatkan baris ini dalam parameter fungsi di compute:
var image = imglib.Image.fromBytes(values[1].width, values[1].height, values[1].planes[0].bytes, format: imglib.Format.bgra);
Dan jalankan dalam lingkaran, memori terus bertambah setiap saat kemudian keluar dari memori dan aplikasi jatuh.
Jika saya tidak memiliki garis itu, memori stabil pada 40MB. Jadi saya pikir dalam penghitungan, itu belum dibersihkan setelah fungsi penghitungan selesai.
Adakah yang memiliki masalah yang sama?
Edit:
Inilah cara saya menerapkan komputasi:
image = await compute(getCropImage, [copyFaces, streamImg]);
Di 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());
}
Dengan imglib adalah paket Gambar:
import 'package:image/image.dart' as imglib;
Setiap kali saya menyebut ini, memori terus bertambah.
var image
di baris pertama getCropImage(...)
tidak dirilis setelah penggunaan, jadi coba gunakan var image
sebagai bidang (agar tidak selalu mengalokasikan memori baru), mungkin dapat berguna untuk tidak instantiate var baru di setiap langkah loop! Selalu mencoba untuk menggunakan kembali jenis objek ini, terutama ketika Anda mengelola dengan objek besar seperti gambar. Umumnya pemulung tidak menjamin untuk membebaskan semua benda yang tidak digunakan. Dan ingat, jangan pernah panggil System.gc()
atau metode serupa langsung (untuk memaksa deallokasi memori), itu gejala kode rusak dan tidak dioptimalkan. :)