Có vấn đề bộ nhớ với cô lập trong ứng dụng rung?


9

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.


Bạn có thể chia sẻ thêm mã? Đặc biệt là phương pháp tính toán.
Esen Mehmet

Tôi đã thêm mã trong chỉnh sửa, kiểm tra xem nó. Cảm ơn đã trả lời tôi. @EsenMehmet
hoangquyy

Phương pháp tính toán là gì? Imglib là gì? Bạn có thể, xin vui lòng, thêm chi tiết?
Igor Kharakhordin

Bạn có thể đọc phương thức tính toán ở đây: api.flutter.dev/flutter/foundation/compute.html , đó không phải là hàm thực hiện của tôi, tôi chỉ sử dụng nó. imglib là gói Hình ảnh: pub.dev/packages/image . Xin lỗi, tôi xấu @IgorKharakhordin
hoangquyy

1
Tôi nghĩ rằng var imagetrong 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 imagenhư 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. :)
Roberto Manfreda

Câu trả lời:


0

Để thử sao chép với mẫu của bạn, tôi đã phải chuyển đổi từ một ui. Hình ảnh đầu tiên:

Future<Uint8List> _bytePng(ui.Image image) async {
  ByteData byteData = await image.toByteData(format: ui.ImageByteFormat.rawRgba);
  Uint8List byteList = byteData.buffer.asUint8List(byteData.offsetInBytes, byteData.lengthInBytes);
  return byteList;
}

Phiên bản đơn giản hóa của mẫu của bạn:

imglib.Image image2 = await compute(_getImage, [image1.width, image1.height, byteList]);


Future<imglib.Image> _getImage(List<dynamic> values) async {
  var temp = imglib.Image.fromBytes(values[0], values[1], values[2], format: imglib.Format.bgra);

  var rng = new Random().nextInt(50);
  imglib.Image cropped = imglib.copyCrop(temp, 0, 0, temp.width - rng, temp.height - rng);

  return cropped;
}

Nhưng tôi không thể thấy bộ nhớ vượt quá tầm kiểm soát. Vì vậy, bạn có thể có một cái gì đó khác đang diễn ra.


Bạn đã kiểm tra bộ nhớ trong chế độ Hồ sơ? Phiên bản nào của flutter bạn đang sử dụng? Tôi không chắc chắn nhưng có lẽ nó đến từ phiên bản rung. Ai đó có cùng một vấn đề như tôi: - stackoverflow.com/questions/57826962/iêu
hoangquyy


Vì vậy, tôi nghĩ rằng vấn đề không đến từ mã của tôi. Tôi đã sử dụng cách khác để giải quyết vấn đề này nhưng không sử dụng cách ly nữa. Tuy nhiên, thật tốt khi giải quyết vấn đề bộ nhớ này, cảm ơn bạn.
hoangquyy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.