2012-03-15 38 views
6

Tôi đang tạo một bản sao tiểu hành tinh, nhưng với một vài chuông và còi.Làm thế nào để điều này hiệu quả hơn?

Hiện tại, tôi có ArrayList<Asteroid> chứa tất cả các tiểu hành tinh trên màn hình. Mỗi cái có một số Vector được liên kết với nó và mở rộng lớp học GameObject genereic xử lý bản vẽ và cập nhật và những thứ phổ biến khác mà mỗi đối tượng trò chơi có điểm chung.

Điều đó được nói mỗi khi tôi phá hủy một tiểu hành tinh, tôi tạo đối tượng Asteroid mới và thêm nó vào ArrayList<Asteroid> ... Có một sự chậm trễ đáng chú ý khi điều này xảy ra khi tôi cũng tạo hạt nổ và tôi giả định đây là GC.

Ý tưởng của tôi là thay vì tạo đối tượng mới khi đang di chuyển, để tôi có thể tạo trước một nhóm và chỉ sử dụng lại chúng.

Đây có phải là ý tưởng đúng không? Ngoài ra, cách tổ chức và hiệu quả nhất để thực hiện điều đó là gì?

Mọi ý tưởng khác cũng sẽ tuyệt vời. Chỉ cần cố gắng giảm thiểu việc tạo ra tất cả các đối tượng này bởi vì nó chắc chắn gây ra sự chậm trễ đáng chú ý. Cảm ơn!

+1

Bạn đã cố gắng tìm hiểu những gì cần có thời gian với DDMS? – dan

+0

Tôi đoán là sự chậm trễ là do mã của bạn chờ đợi cho vụ nổ kết thúc xảy ra trước khi tạo một đối tượng tiểu hành tinh mới. Hãy thử làm cho hoạt hình tiểu hành tinh bùng nổ không đồng bộ? – deed02392

+0

@dan: Tôi đã không làm điều này, mặc dù tôi nghĩ rằng nó sẽ giúp đỡ. Tôi không sử dụng DDMS nhiều, làm thế nào tôi có thể sử dụng nó để xem những gì mất nhiều thời gian nhất? –

Trả lời

5

Tạo một nhóm đối tượng và sử dụng lại chúng là một ý tưởng hay. Ngoài ra tôi nghĩ bạn có thể chuyển từ ArrayList thành Vector, vì Vectơ được tối ưu hóa cho việc lập chỉ mục ngẫu nhiên mà bạn sẽ thực hiện rất nhiều khi sử dụng một nhóm.

Vì bạn nói rằng mỗi lần bạn phá hủy một tiểu hành tinh, bạn thêm một tiểu hành tinh mới, có vẻ như bạn làm việc với số lượng tiểu hành tinh không đổi. Vì vậy, bạn có thể tạo hồ bơi với số lượng thành viên không đổi.

+0

Cảm ơn! Tôi chắc chắn sẽ chuyển sang một 'Vector'. Đó là một gợi ý tuyệt vời, và tốt để biết cho các dự án trong tương lai. –

5

(1) Cân nhắc thiết kế đối tượng của bạn bằng mẫu Cân thừa. Nó là một mẫu thường được sử dụng cho các đối tượng có đặc điểm lặp lại. Mẫu mã java có sẵn tại đây: http://en.wikipedia.org/wiki/Flyweight_pattern

(2) Nếu bạn đã biết bạn sẽ sử dụng bao nhiêu đối tượng, hãy xem xét việc tạo đối tượng và một số quy trình khởi tạo khác vào trang tải.

+0

Tôi nghĩ rằng tôi chắc chắn sẽ di chuyển để tạo ra các đối tượng mà tôi cần. Bạn nói đúng, vì tôi biết số lượng tôi cần tạo nên điều đó sẽ giúp ích. Tôi sẽ nhìn vào mô hình Flyweight. Tôi thích âm thanh của nó. –

4

Thông thường Java rất tốt ở cả việc phân bổ đối tượng mới và thực hiện GC đối tượng đã được tạo gần đây nên tôi sẽ không cho rằng việc gộp nhóm sẽ cải thiện mọi thứ. Bạn có chắc chắn rằng bạn không tạo bất kỳ "rác" nào khác có thể gây ra GC đầy đủ (loại GC tạm dừng chương trình trong thời gian dài) không? Bạn có thể xác minh rằng nó thực sự là GC đang gây ra vấn đề bạn quan sát bằng cách cho phép "ghi nhật ký GC chi tiết" (Google cho điều này có một số đối số dòng lệnh cho JVM cho phép nó với mức độ chi tiết khác nhau).

+0

Tôi không tin rằng tôi đang tạo ra "rác" khác nhưng tôi sẽ có một cái nhìn tốt thông qua để chắc chắn. Vì tôi đang sử dụng Android nên tôi không thể sử dụng JVM chuẩn nhưng tôi có thể sử dụng DDMS để xác định GC là gì. –

+0

Tôi chưa thực hiện bất kỳ phát triển Android nào vì vậy những gì tôi đã nói có thể không giữ với Dalvik "JVM". Khi phát triển các hệ thống nhúng thời gian thực (mà tôi đã làm rất nhiều trong quá khứ), việc gộp chung là một thực hành tiêu chuẩn và đưa nó đến cùng cực (trước khi phân bổ các đối tượng thường dùng nhất) đã giải quyết được nhiều vấn đề thời gian thực cho tôi trong những ngày đó. Tuy nhiên, tôi sẽ nghi ngờ rằng sẽ khó để làm cho trò chơi của bạn "phân bổ miễn phí" vì các thư viện đồ họa bạn đang sử dụng nhiều khả năng đang phân bổ động ... – Javafanboy

4

Tôi tính hiệu ứng của bạn hạt là thủ phạm của sự chậm lại, không phải là tạo đối tượng.

Nhà phát triển trò chơi thường có độ dài tuyệt vời để đảm bảo đồ họa của họ nhanh, nhưng thực hiện nhiều thỏa hiệp hiệu suất trong tập lệnh. Điều này là vì lý do rất tốt: Hiệu suất đạt được trong việc tạo và lưu trữ các đối tượng trò chơi là trong hầu hết các trường hợp không đáng kể so với cú đánh từ tính toán vật lý của họ và vẽ đồ họa của họ.

Cố gắng giảm số lượng và độ phức tạp đồ họa (đặc biệt là nếu họ có minh bạch; ảnh hưởng của điều đó rất nhanh chóng ngăn xếp lên đến điên) của các hạt của bạn.

+0

Tôi nghĩ bạn đang đúng với các hạt đang bị chậm lại. Tôi sẽ cố gắng tạo chúng trong một chủ đề riêng biệt và xem liệu nó có giúp ích gì không. Họ cũng thực hiện tính minh bạch để có thể là một cái gì đó để suy nghĩ về là tốt. –

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