trò chơi android - làm thế nào để lưu trữ các yếu tố trò chơi để gc không cháy


8

Tôi đang phát triển một trò chơi Android và tôi có một câu hỏi về việc lưu trữ các yếu tố trò chơi mà không cần phải thu gom rác.

Trò chơi của tôi cần một bộ sưu tập trong đó các yếu tố trò chơi được lưu trữ theo vị trí x, y (tất cả các yếu tố trò chơi có x, y, chiều rộng và chiều cao). Bộ sưu tập sau đó được gọi là mọi khung hình để truy xuất các yếu tố theo cameraX, cameraY, chiều rộng và chiều cao camera (người dùng có thể cuộn quanh trò chơi).

Thí dụ:

 function draw() {
   tmp = collection.getElements(tmp,cameraX,cameraY,cameraWidth,cameraHeight);
     for(int i = 0; i < tmp.size(); i++) {
        tmp.get(i).draw();
     } 
  }

Tôi hiện đang sử dụng lớp Vector để biểu diễn các phần tử bộ sưu tập, nhưng gc cứ bắn mỗi vài phút. Tôi làm tất cả các phân bổ của tôi lên phía trước. Tôi cũng đã sửa đổi hàm getElements để chấp nhận thêm 1 tham số - một vectơ tạm thời (được trả trước) chứa đầy các phần tử và sau đó được trả về.

Tôi nên lưu trữ các yếu tố trò chơi như thế nào để gc không kích hoạt (tôi không bao giờ thích nếu có thể)?

Tôi cũng thêm các yếu tố vào bộ sưu tập trong thời gian chạy, tôi có phải phân bổ chúng trả trước không?

Câu trả lời:


3

Có, nếu bạn phân bổ bất cứ thứ gì trong thời gian chạy, cuối cùng nó sẽ kích hoạt GC. Nói chung, bạn khắc phục điều này bằng cách triển khai một nhóm đối tượng ... bằng cách đó, bạn có thể phân bổ (hoặc ít nhất là thu thập các thể hiện mới để tái sử dụng) tất cả các đối tượng như đạn và các thực thể khác để tránh kích hoạt GC.

chỉnh sửa: Bạn cũng có thể muốn sử dụng trình lược tả bộ nhớ (như trình phân tích bộ nhớ nhật thực ) có thể giúp bạn tìm ra thói quen nào tạo ra các đối tượng khi chạy.


Vì vậy, sử dụng một lớp Vector sử dụng MyObject []? Nhưng sau đó tôi phải phân bổ kích thước nhóm đối tượng để tôi có thể thêm và xóa động các đối tượng ... một cái gì đó như MyObject [] pool = new MyObject [MAX_OBJECTS]; đây là những gì bạn có nghĩa là?
Jernej

cụ thể hơn, nếu bạn muốn 100% tránh phân bổ đối tượng mới, thì bạn cần phân bổ từng thể hiện có trong mảng đó. Tôi đã viết một lớp trong C # cho khung XNA tạo ra sự cân bằng tốt ... nó chỉ tạo ra các thể hiện mới khi nhóm không có một thể hiện hiện tại để cung cấp. Kết quả là một vài giây đầu tiên có thể phân bổ một vài đối tượng, nhưng một khi chúng ta đạt đến số lượng đồng thời tối đa, không có phân bổ mới nào xảy ra. Nên tương đối dễ dàng để chuyển đổi sang java: codecube.net/2010/01/xna-resource-pool
Joel Martinez

2

Tôi cũng đề nghị đọc qua mã nguồn cho Đảo bản sao , được phát triển bởi một kỹ sư Android. Anh ta có một lớp nhóm đối tượng chung có thể được mở rộng cho nhóm các đối tượng tùy chỉnh. Anh ta cũng có một lớp mảng tùy chỉnh (với khả năng thêm / xóa / tìm kiếm) để tránh phải sử dụng một trình vòng lặp khi duyệt qua một mảng các đối tượng.

Cũng muốn đề cập rằng DDMS trên SDK Android trong Eclipse có thể theo dõi phân bổ bộ nhớ (xem tab Allocation Tracker trong hình ảnh).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.