2009-10-08 25 views
7

Một thời gian trước, tôi đã đăng một câu hỏi liên quan đến rò rỉ bộ nhớ WriteableBitmap, và mặc dù tôi đã nhận được các mẹo tuyệt vời liên quan đến vấn đề này, tôi vẫn nghĩ rằng có một lỗi nghiêm trọng/(lỗi do tôi tạo ra)/(Lẫn lộn)/(một số thứ khác) ở đây.Làm thế nào để vứt bỏ một Bitmap có thể ghi? (WPF)

Vì vậy, đây là vấn đề của tôi một lần nữa:

Giả sử chúng tôi có ứng dụng WPF có hình ảnh và nút. Nguồn của hình ảnh là một bitmap thực sự lớn (3600 * 4800 px), khi nó được hiển thị khi chạy ứng dụng tiêu thụ ~ 90 MB.

Bây giờ giả sử tôi muốn khởi tạo một WriteableBitmap từ nguồn của hình ảnh (Hình ảnh thực sự lớn), khi điều này xảy ra các ứng dụng tiêu thụ ~ 220 MB.

Bây giờ đến phần khó khăn, khi sửa đổi hình ảnh (thông qua WriteableBitmap) kết thúc, và tất cả các tham chiếu đến WriteableBitmap (ít nhất là những gì tôi biết) bị hủy (ở cuối phương thức hoặc bằng cách đặt chúng thành null) bộ nhớ được sử dụng bởi writeableBitmap sẽ được giải phóng và mức tiêu thụ ứng dụng sẽ trở về ~ 90 MB. Vấn đề là đôi khi nó trả về, đôi khi nó không.

Dưới đây là một số mẫu mã:

// The Image's source whas set previous to this event 
private void buttonTest_Click(object sender, RoutedEventArgs e) 
    { 
     if (image.Source != null) 
     { 
      WriteableBitmap bitmap = new WriteableBitmap((BitmapSource)image.Source); 

      bitmap.Lock(); 

      bitmap.Unlock(); 

      //image.Source = null; 
      bitmap = null; 
     } 
    } 

Như bạn có thể thấy các tài liệu tham khảo là địa phương và bộ nhớ nên được phát hành vào cuối của phương pháp này (Hoặc khi các nhà sưu tập rác quyết định làm như vậy). Tuy nhiên, ứng dụng có thể tiêu thụ ~ 224 MB cho đến khi kết thúc vũ trụ.

Mọi trợ giúp đều tuyệt vời.

Trả lời

0

Có cần phải hiển thị hình ảnh bitmap ở cùng độ phân giải và pixel không? Bạn có thể tạo writeablebitmap ở một tập hợp các pixel thấp hơn nhiều và gọi phương thức render. Kể từ khi writeablebitmap mang một tham chiếu đến uielements ban đầu khi gọi render, trong trường hợp này, bạn sẽ có 3 khối: 1) gốc uielement, 2) pixel trong writeablebitmap, 3) tham khảo để sao chép bản gốc.

Tôi đã có một vấn đề tương tự với WriteableBitmap về rò rỉ bộ nhớ và tôi cố định nó từ kiểm tra liên kết này: http://www.wintellect.com/CS/blogs/jprosise/archive/2009/12/17/silverlight-s-big-image-problem-and-what-you-can-do-about-it.aspx

Nếu bạn tạo WriteableBitmap khác và sao chép các điểm ảnh trên, sau đó xử lý các WriteableBitmap đầu tiên bạn sẽ thấy một số bộ nhớ phát hành - ít nhất tôi đã làm trong kịch bản của tôi.

Các vấn đề liên quan