flutter 앱의 메모리에 문제가 있습니다. 컴퓨팅을 사용할 때 컴퓨팅의 함수 매개 변수 에이 줄을 넣습니다.
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 19
계산 방법이란 무엇입니까? imglib는 무엇입니까? 더 자세한 내용을 추가 할 수 있습니까?
—
Igor Kharakhordin
여기에서 계산 방법을 읽을 수 있습니다 : api.flutter.dev/flutter/foundation/compute.html , 그것은 내 구현 기능이 아니며 그냥 사용합니다. imglib는 Image : pub.dev/packages/image 패키지 입니다. 죄송합니다 내 나쁜 @IgorKharakhordin
—
hoangquyy
필자
—
Roberto Manfreda
var image
는 첫 번째 줄 getCropImage(...)
에서 사용 후 릴리스되지 않으므로 var image
필드를 사용하여 시도하십시오 (항상 새로운 메모리를 할당하지 않기 위해), 모든 루프 단계에서 새 var를 인스턴스화하지 않는 것이 유용 할 수 있습니다! 특히 이미지와 같은 큰 객체로 관리 할 때는 항상 이러한 유형의 객체를 재사용하십시오. 일반적으로 가비지 수집기는 사용되지 않은 모든 개체를 해제한다고 보장하지는 않습니다. 또한 System.gc()
메모리 할당을 강제로 해제하기 위해 직접 또는 유사한 메소드를 호출 하지 마십시오. 이는 코드가 깨지거나 최적화되지 않은 증상입니다. :)