Ben flutter uygulaması ile bellek hakkında bir sorun var, compute kullanırken, compute işlev parametresine bu satırı koymak:
var image = imglib.Image.fromBytes(values[1].width, values[1].height, values[1].planes[0].bytes, format: imglib.Format.bgra);
Ve döngüde çalıştırın, bellek her zaman sonra bellek dışında büyümeye devam ve uygulama çöktü.
Bu çizgiye sahip değilsem, bellek 40mb'de sabittir. Bu yüzden hesaplamada, hesaplama fonksiyonu bittikten sonra temizlenmediğini düşünüyorum.
Aynı problemi olan var mı?
Düzenle:
Bu şekilde hesaplama uygulamak:
image = await compute(getCropImage, [copyFaces, streamImg]);
GetCropImage içinde:
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());
}
İmglib ile Görüntü paketi:
import 'package:image/image.dart' as imglib;
Bunu her söylediğimde, bellek büyümeye devam ediyor.
var image
ilk satırında getCropImage(...)
, bu yüzden var image
alan olarak kullanmayı deneyin (her zaman yeni bellek ayırmak için değil), belki de her döngü adımında yeni bir var somutlaştırmak için yararlı olabilir! Her zaman bu tür nesneleri, özellikle görüntü gibi büyük nesnelerle yönetirken yeniden kullanmaya çalışın. Genellikle çöp toplayıcı kullanılmayan tüm nesnelerin serbest bırakılmasını garanti etmez. Ve unutmayın, asla doğrudan çağırma System.gc()
veya benzer yöntemleri doğrudan (bellek ayırmayı zorlamak için), bu kırık ve optimize edilmemiş kod belirtisidir. :)