2013-01-25 27 views
5

Tôi đã có ý định hỏi điều này trong một thời gian ngắn. Tôi đang tạo ra trò chơi này, nơi tôi vẽ một nền rất lớn. Nhưng vấn đề là (tất nhiên), khi tôi đưa nhiều yếu tố hơn vào trò chơi, tôi nhận được Ngoại lệ OutOfMemory.Ngoại lệ OutOfMemory: Việc nén hình ảnh có làm giảm kích thước heap không?

Điều tôi muốn hỏi là nén hình ảnh sẽ giảm phân bổ kích thước heap? Ví dụ: nền PNG của tôi (3000 x 2000 pixel) là khoảng 1,5 MB. Sau một loạt các lần nén PNG (Thông qua các phần mềm như TinyPNG và PNGGauntlet), kích thước của nền đã giảm đáng kể xuống còn 712 KB. Hình ảnh nén ở đây vẫn có cùng kích thước với bản gốc (3000 đến 2000).

Phân bổ kích thước heap cho kích thước nền ban đầu (1,5 MB) có giống với kích thước được nén (712 KB) không?

+1

Câu hỏi rất hay. Câu trả lời có lẽ là "có", bởi vì hệ thống đồ họa cần hình ảnh không nén để vẽ trên màn hình, nhưng tôi không chắc chắn. Tôi sẽ cố gắng thu hẹp lại nền, tới 1500, 1000, và xem nếu mức tiêu thụ bộ nhớ giảm xuống bốn lần. – dasblinkenlight

+0

Có, tôi sẽ thử điều đó ngay sau khi tôi kết thúc với các mô-đun khác. Tôi không chắc chắn làm thế nào để đi về điều này, nhưng sau khi thực hiện nén hình ảnh, FPS của trò chơi đã tăng lên đáng kể. Tuy nhiên, tôi không hoàn toàn chắc chắn nếu kích thước heap đã được giảm. – dabaerju

Trả lời

1

Câu trả lời là có, cả hình ảnh nén và không nén chiếm cùng một lượng bộ nhớ - cuối cùng chúng chỉ kết thúc dưới dạng lưới của các giá trị R, G, B (, A).
Lần duy nhất bạn có thể lưu một số bộ nhớ là nếu bạn đang sử dụng một dạng nén mà GPU hỗ trợ trực tiếp (ví dụ: nén S3TC cho kết cấu OpenGL).

Nén giảm hai thứ: kích thước tệp trên đĩa và lượng thời gian IO cần để tải tệp (mặc dù quá trình giải nén này có thể được bù đắp).

Tuy nhiên, bạn có thể xem tải hình ảnh vào loại bitmap khác với ARGB_8888 (ví dụ: RGB_565) - điều này sẽ giảm lượng bộ nhớ cần thiết để lưu trữ bitmap (nhưng chất lượng của hình ảnh sẽ bị giảm).

+0

Tôi đã rất bối rối vì lý do tại sao tôi tiếp tục nhận được một ngoại lệ OutOfMemory ngay cả sau khi nén những hình ảnh này. Theo như điều này đi, bây giờ tôi biết rằng nén chỉ cải thiện hiệu suất trên màn hình cũng như giảm thời gian cần để tải. Cảm ơn bạn rất nhiều vì đã dọn dẹp! Tôi đoán không có cách nào khác hơn là cho phép kích thước heap lớn hoặc giảm kích thước tập tin. – dabaerju

+1

Bạn có thể tải hình ảnh vào một loại bitmap khác với ARGB_8888 (ví dụ: RGB_565 - điều này sẽ sử dụng một nửa bộ nhớ). –

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