2012-11-10 39 views
11

Mọi người, tôi không nghĩ rằng rằng đây là một bản sao và KHÔNG phải là một trong số đó làm cách nào để tránh các câu hỏi OOMs. Đây là một nhiệm vụ chính thức để tìm hiểu kiến ​​thức, vì vậy hãy giữ các phiếu bầu đó, vui lòng ...Tại sao Android phân bổ bộ nhớ nhiều hơn mức cần thiết khi tải hình ảnh

Hãy tưởng tượng tôi có một số JPEG của 500x500 pixel. Tôi tải nó dưới dạng ARGB_8888 là "bad as it gets".

Tôi mong chờ Android để phân bổ 500x500x4 bytes = a little under 1MB Tuy nhiên, nhìn vào một đống đổ và bạn sẽ thấy rằng Android phân bổ nhiều hơn đáng kể, thường là yếu tố lớn hơn 5-10 lần.

Bạn thường xuyên xem các câu hỏi trên đây về OOMS nơi stack trace cho thấy một heap request of say 15MB và nó là Luôn lớn hơn nhiều so với yêu cầu đơn giản chỉ để giữ byte của hình ảnh. Các OP thường bắt một số downvotes sau đó là bombarded với câu trả lời chứng khoán và ý kiến ​​về việc sử dụng bộ nhớ ít hơn (nhờ Romain!) Và trong quy mô. Tôi nghĩ rằng có nhiều hơn đáp ứng mắt ở đây.

Bất kỳ ai biết tại sao điều này là?

Nếu không có câu trả lời rõ ràng, tôi sẽ đặt cùng một SSCCE nếu có ích.

PS. Tôi giả định rằng JPEG vs PNG vv là không thích hợp kể từ khi chúng tôi đang nói về việc sử dụng bộ nhớ của bitmap sao lưu mà chỉ đơn giản là x lần y lần BPP - hoặc tôi đang chậm?

+4

Bạn có chắc chắn rằng bạn không làm cho hình ảnh được thu nhỏ theo cách bạn áp dụng nó (ví dụ: tải nó vào một 'ImageView' không cùng kích thước)? Hơn nữa, khi bạn nhìn vào đống rác của bạn, bạn sẽ thấy chính xác nơi các "yếu tố 5-10 lần lớn hơn" phân bổ đã đi - nơi bạn đã thấy những giá trị gió lên? "Tôi sẽ kết hợp SSCCE nếu nó giúp" - làm ơn. – CommonsWare

+0

Ah. Có vẻ như tôi có thể bị chậm. Hãy để tôi thử một ví dụ và quay lại nếu và khi tôi thấy rằng nó không mở rộng quy mô khi áp dụng. Cảm ơn – Simon

+0

Rất kỳ quặc, anh chàng trong [câu hỏi này] (http://stackoverflow.com/questions/4866653/read-in-jpg-as-rgb888-on-android) * muốn * và ARGB8888 nhưng vẫn nhận được RGB565 . Có lẽ bạn có thể sử dụng phương pháp của mình? – GolezTrol

Trả lời

1

Nó từng là một mẹo khá phổ biến với quản lý bộ nhớ để lấy một hồ bơi hoặc khối bộ nhớ được chuyển thành các yêu cầu nhỏ hơn. Khi tôi làm việc với các hệ thống nhúng, đó là một thực tế phổ biến để duy trì các bộ nhớ có kích thước khác nhau và chúng tôi chỉ phân bổ một khối lớn hơn số lượng yêu cầu từ một hồ bơi. Đó là một cách thuận tiện để ngăn chặn quá nhiều phân mảnh bộ nhớ. Có lẽ điều này đang xảy ra ở đây.

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