У меня проблема с памятью в приложении flutter, при использовании compute я помещаю эту строку в параметр функции в compute:
var image = imglib.Image.fromBytes(values[1].width, values[1].height, values[1].planes[0].bytes, format: imglib.Format.bgra);
И запустить его в цикле, память продолжает расти каждый раз, затем не хватает памяти и приложение падает.
Если у меня нет этой строки, память стабильна на 40 МБ. Так что я думаю, что в вычислениях он не был очищен после завершения функции вычисления.
У кого-нибудь есть такая же проблема?
Редактировать:
Вот как я реализую вычисления:
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;
Каждый раз, когда я это называю, память продолжает расти.
var image
первая строка getCropImage(...)
не выпускается после использования, поэтому попробуйте использовать var image
поле as (чтобы не всегда выделять новую память), может быть полезно не создавать экземпляр нового var на каждом шаге цикла! Всегда старайтесь повторно использовать эти типы объектов, особенно когда вы управляете большими объектами, такими как изображения. Обычно сборщик мусора не гарантирует освобождение всех неиспользуемых объектов. И помните, никогда не вызывайте System.gc()
или подобные методы напрямую (для принудительного освобождения памяти), это признак неисправного и неоптимизированного кода. :)