Tôi gặp vấn đề về bộ nhớ với ứng dụng rung, khi sử dụng tính toán, tôi đặt dòng này trong tham số hàm trong tính toán:
var image = imglib.Image.fromBytes(values[1].width, values[1].height, values[1].planes[0].bytes, format: imglib.Format.bgra);
Và chạy nó trong vòng lặp, bộ nhớ cứ tăng dần lên sau khi hết bộ nhớ và ứng dụng bị sập.
Nếu tôi không có dòng đó, bộ nhớ ổn định ở mức 40mb. Vì vậy, tôi nghĩ rằng trong tính toán, nó không được làm sạch sau khi chức năng tính toán kết thúc.
Bất cứ ai cũng có vấn đề tương tự?
Biên tập:
Đây là cách tôi thực hiện tính toán:
image = await compute(getCropImage, [copyFaces, streamImg]);
Trong 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());
}
Với imglib là gói Image:
import 'package:image/image.dart' as imglib;
Mỗi khi tôi gọi điều này, bộ nhớ tiếp tục phát triển.
var image
trong dòng đầu tiên của getCropImage(...)
bản phát hành không được phát hành sau khi sử dụng, vì vậy hãy thử sử dụng var image
như trường (để không phân bổ bộ nhớ mới luôn), có thể hữu ích để không khởi tạo var mới ở mỗi bước lặp! Luôn cố gắng sử dụng lại các loại đối tượng này, đặc biệt là khi bạn đang quản lý với các đối tượng lớn như hình ảnh. Nói chung, trình thu gom rác không đảm bảo giải phóng tất cả các đối tượng không sử dụng. Và hãy nhớ, không bao giờ gọi System.gc()
trực tiếp hoặc các phương thức tương tự (để buộc phân bổ bộ nhớ), đó là triệu chứng của mã bị hỏng và không được tối ưu hóa. :)