2012-03-31 37 views
6

Tôi đang phát triển trò chơi trên android. Tôi đang sử dụng chế độ xem bề mặt.Tôi đang sử dụng một số hình ảnh làm bitmap. (Spritesheets, tilesets, buttons, backgrounds, efects vs.) Bây giờ hình ảnh gần 5-6 mb. Và tôi gặp lỗi này khi tôi chạy trò chơi của mình:Kích thước bitmap vượt quá ngân sách VM khi phát triển trò chơi

kích thước Bitmap vượt quá ngân sách VM

19.464.192 byte phân bổ bên ngoài quá lớn đối với quá trình này.

tôi gọi hình ảnh như thế

BitmapFactory.decodeResource(res, id) 

và tôi đặt nó vào mảng. Tôi không thể chia tỷ lệ hình ảnh.Tôi đang sử dụng tất cả chúng. Tôi cố gắng đó

options.inPurgeable=true; 

và nó hoạt động nhưng hình ảnh đang tải tải rất slowly.I một spritesheet với điều đó và khi nó đang tải, tôi nhận được fps rất rất thấp.

Tôi có thể làm gì?

Trả lời

0

Tôi không phải là nhà phát triển trò chơi nhưng tôi muốn nghĩ rằng tôi biết đủ Android.

Tải hình ảnh có kích thước gần như chắc chắn là sẽ ném lỗi. Tại sao hình ảnh có kích thước tệp?

Có ví dụ tại http://p-xr.com/android-tutorial-how-to-paint-animate-loop-and-remove-a-sprite/. Nếu bạn nhận thấy anh ta có một vụ nổ chỉ có ~ 200Kb. Ngay cả một hình ảnh chi tiết hơn cũng sẽ không chiếm nhiều dung lượng tập tin hơn nữa.

OK một số gợi ý:

  • Bạn tải tất cả spritesheets của bạn vào một tờ đơn hoặc là mỗi spritesheet trong một file riêng biệt? Nếu tất cả chỉ là một, tôi sẽ chia chúng.

  • Giảm độ phân giải của hình ảnh, thiết bị Android là di động và một số chỉ có màn hình có độ phân giải thấp. Ví dụ: HTC Wildfire có độ phân giải 240x320 (thiết bị LDPI) và khá là thiết bị chung. Bạn đã không nói kích thước hình ảnh vì vậy chúng tôi không thể chắc chắn nếu điều này là thực tế.

Cuối cùng; Tôi không phải là lập trình viên trò chơi nhưng tôi đã tìm thấy hướng dẫn này (một phần của cùng một loạt) khá ngộ nghĩnh - http://p-xr.com/android-tutorial-2d-canvas-graphics/. Tôi tự hỏi nếu bạn đang áp dụng một mẫu không thích hợp cho Android, tuy nhiên không có mã tôi không thể nói.

phải một chút gì đó off topic nhưng đáng chú ý ...

dân theo ước tính sức mạnh của View. Mặc dù có một số lượng logic nhất định để sử dụng SurfaceView, Chế độ xem chuẩn sẽ tự làm rất nhiều. SurfaceView thường xuyên hơn không yêu cầu một chuỗi cơ bản để chạy (bạn sẽ phải tự thiết lập) để làm cho nó hoạt động.Tuy nhiên, Chế độ xem có thể gọi onDraw(), có thể được sử dụng theo nhiều cách khác nhau bao gồm phương pháp postinvalidate() (xem What does postInvalidate() do?).

Trong mọi trường hợp, có thể bạn nên xem hướng dẫn này http://mindtherobot.com/blog/272/android-custom-ui-making-a-vintage-thermometer/. Cá nhân, nó là một ví dụ tuyệt vời của một View tùy chỉnh và những gì bạn có thể làm với chúng. Tôi viết lại một vài phần và tạo ra một ứng dụng đồng hồ bỏ túi.

+0

Tôi cảm ơn sự giúp đỡ của bạn nhưng tôi không thể giải quyết. Tôi sử dụng spritesheet lớn vì có quá nhiều hoạt hình. Ví dụ, đây là hình ảnh động của một sinh vật trong trò chơi của tôi: http://nafiz.in/bigeye.png Tôi sử dụng galaxy s và tôi đang sử dụng spritesheets kích thước đầy đủ này. Firsly tôi phải làm việc đó trên thiết bị của tôi. Có lẽ, có 7-8 mb giới hạn cho bitmap.I nghiên cứu một lần nữa và tôi tìm thấy để giải quyết vấn đề này mà tôi phải sử dụng jni hoặc opengl.But điểm đó, tôi không thể sử dụng chúng.Maybe dự án khác. Tôi sẽ loại bỏ một số hoạt ảnh và làm việc về quản lý heap. –

2

Tôi cũng gặp sự cố này; thực sự không có giải pháp nào ngoài việc giảm số lượng/kích thước của bitmap mà bạn đã tải cùng một lúc. Một số thiết bị Android cũ hơn chỉ cấp 16MB cho heap cho toàn bộ ứng dụng của bạn, và bitmap được lưu trữ trong bộ nhớ không nén khi bạn tải chúng, do đó không khó vượt quá 16MB với nền lớn, vv (An 854x480, bitmap 32 bit) Trong trò chơi của tôi, tôi đã có thể thực hiện nó bằng cách chỉ tải bitmap mà tôi sẽ sử dụng ở cấp độ hiện tại (ví dụ: tôi có một đối tượng Bitmap duy nhất cho nền được tải lại từ các tài nguyên trong mỗi phần tử). thời gian nó thay đổi, thay vì duy trì nhiều Bitmap trong bộ nhớ. Tôi chỉ duy trì một int theo dõi tài nguyên mà tôi đã tải hiện tại.)

Trang sprite của bạn rất lớn, vì vậy tôi nghĩ bạn cần phải giảm kích thước hoạt ảnh của bạn. Ngoài ra, tải từ nguồn tài nguyên nhanh chóng, vì vậy bạn có thể thoát khỏi việc thực hiện một việc gì đó như chỉ tải dải hoạt ảnh theo hướng hiện tại của nhân vật và khiến anh ấy tạm dừng khi anh ấy quay trong khi bạn thay thế bằng dải hoạt ảnh mới. Điều đó có thể trở nên phức tạp.

Ngoài ra, tôi đặc biệt khuyên bạn nên thử nghiệm ứng dụng của mình trên trình giả lập với vùng heap VM được đặt thành 16mb, để đảm bảo bạn đã khắc phục sự cố cho tất cả các thiết bị. (Bộ giả lập thường mặc định là 24mb, vì vậy thật dễ dàng để được kiểm tra và tạo ra một số đánh giá 1 sao sau khi phát hành.)

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