2012-12-19 34 views
9

Tôi đang tạo trò chơi Android này bằng Java. Tôi có khá nhiều hình ảnh nhưng không cần phải sử dụng chúng cùng một lúc, vì vậy tôi đã tạo một lớp Resource Manger để quản lý các Bitmap đang được sử dụng. Tuy nhiên, tôi đã tìm thấy nó khá chậm để xóa Bitmap ra khỏi bộ nhớ. Tôi hiện đang làm một cái gì đó như thế này:Tải nhanh bitmap từ bộ nhớ

bitmap.recycle() 
bitmap = null 

System.gc (also tried Runtime.getRuntime().gc()) 

Thứ nhất, là có cách nào để nhanh dỡ bỏ các bitmap từ bộ nhớ hoặc là nó có thể kiểm tra bằng cách nào đó nếu họ thực sự bị xóa vì vậy tôi có thể làm cho màn hình tải phụ thuộc vào Cũng vậy?

+2

Bạn có thể xem xét sử dụng công cụ lưu vào bộ nhớ cache bitmap hiện có thay vì tự động cuộn: http://www.senab.co.uk/2012/12/18/android-bitmapcache-the-rebirth/ – CommonsWare

+1

Lý do là chậm bạn đang gọi gc. Hãy để nó chạy khi cần thiết. +1 @CommonsKhông cần phải tái tạo lại bánh xe. Gọi số – iagreen

+4

.recycle() và thiết lập nó thành null thực sự chỉ cần làm điều đó. Không cần phải gọi .gc() :) –

Trả lời

0

Như SylvainL đã nói, System.gc và bạn bè thu thập toàn bộ rác và có thể khá chậm. Máy Java chạy GC định kỳ, và khoảng thời gian là finetuned tùy thuộc vào bao nhiêu bộ nhớ miễn phí có sẵn tại một thời điểm nhất định.

Lựa chọn tốt nhất cho tôi là sử dụng một số loại bitmap pooling: có một tập hợp các trường hợp bitmap prefab mà bạn có thể thu được từ và phát hành tới hồ bơi, và quản lý các thể hiện đệm trong bộ nhớ cache áp dụng các chính sách LRU.

Với finetuning thích hợp, bạn có thể không tốn chi phí khi tạo và hủy các bản sao Bitmap khi chúng được gộp chung và các trường hợp đệm chứa dữ liệu bitmap sẽ được nạp tự động và không tải từ bộ nhớ tùy thuộc vào cách sử dụng.

1

Không có gì đảm bảo rằng người thu gom rác sẽ thực sự chạy khi chúng tôi cố gắng System.gc() vì gc() dự kiến ​​các điều kiện tiên quyết nhất định như nạn đói tài nguyên. Vì vậy, nó là khá rõ ràng rằng gọi gc() là chỉ lãng phí Cycles CPU quan trọng. Là một nhà phát triển, chúng tôi có thể tạo các đối tượng không cần thiết cho gc sưu tập bằng cách vô hiệu hóa các tham chiếu.

Có một vài kỹ thuật tối ưu hóa có thể hữu ích khi tạo hệ thống chơi trò chơi (trò chơi).

  1. Sử dụng Texture. Đây là example.

  2. Sử dụng Sprite và SpriteSheets (Nó cung cấp ít chi phí cho hệ thống hơn tải bitmap riêng lẻ). nhiều công cụ trò chơi mã nguồn mở có những người sử dụng điều này.Nếu bạn không muốn sử dụng chúng, hãy tìm hiểu cách tạo từ đầu từ các nguồn này.

  3. Sử dụng tài liệu android chuẩn này để biết cách Loading Large Bitmaps EfficientlyCaching Bitmaps để sử dụng bitmap tốt hơn. Ý tưởng là khi thiết bị của người dùng không đủ hiệu quả để xử lý số lượng xử lý và/hoặc bộ nhớ ít hơn cho trò chơi của bạn, bạn luôn có thể giảm tỷ lệ bitmap (thỏa hiệp với chất lượng để có phản hồi tốt hơn).

  4. Luôn kiểm tra ứng dụng của bạn trước các sự cố rò rỉ bộ nhớ. Đây là một số nice post sẽ giúp ích.

  5. Giữ các mục InMemory (không phát hành một khi đã sử dụng) được sử dụng nhiều lần trong trò chơi trong cùng một cảnh. Lý do là phải mất rất nhiều thời gian để tải hình ảnh vào bộ nhớ.

Hy vọng điều này sẽ giúp bạn.

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