2011-12-09 39 views
5

Tôi đang làm việc trên một trò chơi chiến thuật theo lượt trong Java (trong khung công tác Android). Theo cấu trúc trong Bắt đầu trò chơi Android, tôi có một chuỗi kết xuất và một chuỗi giao diện người dùng. Chuỗi hiển thị liên tục cập nhật trạng thái thế giới và sau đó vẽ lại thế giới. Khi người dùng tương tác với màn hình, GUI sẽ gửi các hành động tới thế giới (mẫu lệnh). Bây giờ tôi đang thêm người chơi AI và đây là kế hoạch của tôi:Tôi nên xử lý giao tiếp giữa các luồng AI và vòng lặp trò chơi chính như thế nào?

Mỗi trình phát AI sẽ có AI chạy trên một chuỗi riêng biệt.

Khi thế giới cập nhật trên lượt AI, nó sẽ kiểm tra xem có hành động đang chờ xử lý hay không. Nếu vậy, nó thực hiện nó. Sau đó, nó yêu cầu người chơi AI cho hành động tiếp theo của nó.

Trình phát AI sẽ gửi yêu cầu cho một hành động đến luồng AI và sau đó quay lại.

Cuối cùng, AI sẽ đưa ra một hành động và đăng nó trở lại thế giới, nó sẽ thấy nó trên bản cập nhật tiếp theo.

Hai câu hỏi:

1) Thiết kế này có vẻ hợp lý không?

2) Làm thế nào để xử lý thông tin liên lạc đến và đi từ luồng AI? Nếu tôi có chuỗi AI gọi world.queueAction (action), có vẻ như nó sẽ hoạt động, nhưng nếu thread render gọi ai.chooseAction (thế giới) sẽ chạy hành động chọn trên chuỗi render, đó không phải là thứ tôi muốn .

+0

Bạn không làm logic thế giới trong chuỗi hiển thị, đúng không? – BRFennPocock

Trả lời

4

Tôi sẽ có một ExecutorService cho AI và thêm nhiệm vụ cho nó cho những thứ bạn muốn nó thực hiện. Đối với giao diện người dùng, bạn có thể có hàng đợi những thứ đã thay đổi và có thể cần phải được vẽ lại. Tôi sẽ bị cám dỗ để sử dụng một sợi đơn cho tất cả các AI cho đến khi bạn biết điều này sẽ giúp ích. Hầu hết các thiết bị Android chỉ có 1-2 CPU.

+0

Được rồi, vì vậy lớp AI sẽ thực hiện Runnable và phương thức run() của nó sẽ tính toán bước tiếp theo dựa trên trạng thái mức hiện tại và sau đó xếp hàng Hành động mới cho thế giới. AIPlayer sẽ có một ExecutorService tĩnh. Khi selectAction() được gọi trên đối tượng AIPlayer, nó sẽ cập nhật cá thể AI của nó với trạng thái mức hiện tại, sau đó yêu cầu dịch vụ thi hành chạy thể hiện AI của nó. – Perikles

+1

Dường như hoạt động, cảm ơn! – Perikles

1

Nếu tôi hiểu đúng:

  • Bạn có một sợi rendering. Có lẽ, điều này chạy ở tốc độ khung hình hiển thị.
  • Bạn có chuỗi "logic thế giới". Điều này chạy từ một số bộ đếm thời gian dự đoán được.
    • Bạn có vật lý chung, đầu vào trình phát hoặc các tác vụ khác trong một chuỗi;
    • và một thread riêng biệt cho mỗi nhân vật AI

Có vẻ như bạn một cách an toàn có thể chạy mỗi bài luận AI như một Future và đón kết quả của họ với nhau sau khi làm bất cứ điều gì khác "thế giới "chuỗi đang hoạt động, trên mỗi khung hình.

+0

Nó thực sự như thế này: Android UI thread (đăng ký người dùng cảm ứng và các sự kiện khác), Render thread (vẽ màn hình và cập nhật logic thế giới, chạy ở tốc độ khung hình). Vì vậy, không có 'đồng hồ đánh dấu' thông thường trên các bản cập nhật thế giới. Có lẽ nên có? – Perikles

+0

Giả sử, sau đó, đó là bộ đệm hiển thị ngoài màn hình hay gì đó? Không phải tất cả các cập nhật giao diện người dùng phải xảy ra trong một chuỗi trên Android? (Họ đã làm trong 1,5, nhưng tôi đã lỗi thời, tôi biết ...) – BRFennPocock

+0

Nó có một vòng lặp mà thế giới logic cập nhật, làm cho thế giới vào một bộ đệm, và sau đó khóa vải, làm cho bộ đệm, và mở khóa canvas, sau đó quay lại đầu trang. – Perikles

2

Bạn có chắc chắn rằng hệ thống sẽ có thể xử lý một số lượng lớn luồng không? Hãy nhớ rằng số lượng chủ đề chạy 'tối ưu' thường là n + 1, trong đó n là số lượng lõi hệ thống có. Nếu điều này đang chạy trên điện thoại, sẽ có ít người trong số đó khả dụng, mặc dù trừ khi bạn đang chạy hơn 10 bạn có thể có thể là ...

Để kết nối giữa trò chơi và AI của bạn, có thể hữu ích để xem xét sự khác biệt giữa người chơi (người) và AI: chỉ có một sự khác biệt quan trọng - một là máy tính, cái kia thì không.Tốt nhất là nên gửi các hành động mà AI thực hiện theo cùng một hàng đợi (hoặc thông qua cùng một cơ chế chung) như các cầu thủ của con người (vì vậy, hãy gọi world.queueAction(action);). Nó cũng làm cho trao đổi giữa AI và người chơi đơn giản hơn, như mã cập nhật thế giới của bạn không cần phải biết sự khác biệt ...

Tôi giả định rằng bạn đã có một số loại sự kiện để thông báo cho người chơi/cập nhật màn hình khi đến lượt của người chơi. Thực hiện chính xác điều tương tự với chủ đề AI - để nó lắng nghe sự kiện "Đến lượt của bạn" thích hợp, làm cho nó kết thúc (các phép tính lặp lại) và đặt một hành động trên hàng đợi. Xin lưu ý rằng điều này cần được thực hiện từ chủ đề 'cập nhật thế giới'; chuỗi kết xuất phải chỉ liên quan đến việc hiển thị đầu ra cho màn hình (và chỉ liên quan đến đầu vào của trình phát).

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