Ho un problema con la memoria con l'app Flutter, quando uso il calcolo, inserisco questa riga nel parametro della funzione nel calcolo:
var image = imglib.Image.fromBytes(values[1].width, values[1].height, values[1].planes[0].bytes, format: imglib.Format.bgra);
Ed eseguirlo in loop, la memoria continua a crescere ogni volta che si esaurisce la memoria e l'app si è bloccata.
Se non ho quella linea, la memoria è stabile a 40mb. Quindi penso che nel calcolo, non sia stato ripulito dopo il completamento della funzione di calcolo.
Qualcuno ha lo stesso problema?
Modificare:
Ecco come implemento il calcolo:
image = await compute(getCropImage, [copyFaces, streamImg]);
In 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());
}
Con imglib è il pacchetto Image:
import 'package:image/image.dart' as imglib;
Ogni volta che lo chiamo, la memoria continua a crescere.
var image
nella prima riga della getCropImage(...)
non sia rilascio dopo l'uso, quindi prova a usare var image
come campo (per non allocare sempre nuova memoria), forse può essere utile per non creare un'istanza di una nuova var ad ogni passo del ciclo! Cerca sempre di riutilizzare questi tipi di oggetti, specialmente quando gestisci oggetti di grandi dimensioni come le immagini. Generalmente il Garbage Collector non garantisce di liberare tutti gli oggetti inutilizzati. E ricorda, mai chiamare System.gc()
direttamente o metodi simili (per forzare la deallocazione della memoria), questo è sintomo di codice rotto e non ottimizzato. :)