Làm thế nào để một đường ống đầu vào hoạt động?


8

Tôi đã tìm thấy bài viết này về việc triển khai một đường dẫn đầu vào cho Android, nhưng tôi không thực sự hiểu cách thức hoạt động của nó. Tôi cũng không hoàn toàn hiểu khái niệm lập trình của một đường ống hoặc một bể bơi. Ai đó có thể giải thích các khái niệm này và làm thế nào chúng hoạt động như đường ống đầu vào này?

Câu trả lời:


5

Tôi đã không nhìn sâu vào mã nhưng ý tưởng cơ bản là các sự kiện đầu vào không đồng bộ trong Android, có nghĩa là chúng có thể xảy ra bất cứ lúc nào. Bạn không muốn làm gián đoạn mã vòng lặp chính của mình để xử lý các sự kiện đầu vào vì nó có thể làm chậm trò chơi của bạn và có thể thay đổi trạng thái trò chơi của bạn theo những cách không mong muốn.

Cách tiếp cận truyền thống được sử dụng trong mẫu Lunar Lander là có một khối được đồng bộ hóa xung quanh vòng lặp chính và xung quanh mỗi trình xử lý đầu vào của bạn để đảm bảo rằng chúng sẽ không bao giờ xảy ra cùng một lúc. Đây có thể là một cách tiếp cận hợp lệ cho một trò chơi nhỏ nhưng khi trò chơi của bạn trở nên phức tạp hơn, bạn sẽ thấy rằng nó không hiệu quả lắm và nó có thể không hoạt động chính xác.

Bài viết cho thấy một cách tiếp cận tốt hơn về việc lưu trữ các sự kiện đầu vào trong hàng đợi và xử lý chúng tại một điểm đã biết trong vòng lặp chính của bạn. Trình xử lý đầu vào chỉ cần đẩy sự kiện (sau khi gói chúng trong InputObject mô tả chúng) đến cuối hàng đợi và sau đó chúng được xử lý trong phương thức processInput trong luồng trò chơi.

Tác giả của bài viết thực sự sử dụng hai hàng đợi, một hàng đợi đầu vào và một nhóm đối tượng đầu vào. Nhóm đối tượng đầu vào trong hoạt động chính được sử dụng vì chúng tôi không muốn tiếp tục tạo các đối tượng đầu vào mới mỗi khi chúng tôi nhận được một sự kiện đầu vào. Điều này là xấu vì các sự kiện đầu vào xảy ra thường xuyên và tạo ra nhiều đối tượng sẽ khiến trình thu gom rác chạy thường xuyên, điều này làm cho trò chơi của bạn trở nên rối rắm và không phản hồi. Cách tiếp cận tốt hơn là tạo một nhóm đối tượng một lần (về cơ bản là một hàng đợi) và lấy các đối tượng từ hàng đợi khi bạn cần chúng và đưa chúng trở lại hàng đợi khi bạn hoàn thành. Đó là những gì hàng đợi trong hoạt động chính là dành cho. Hàng đợi khác là một hàng đợi đầu vào trong luồng trò chơi thực sự chứa các sự kiện đầu vào nhận được và được xử lý vòng lặp trò chơi bằng phương thức processInput.

Hàng đợi nhóm sẽ luôn có một số lượng đối tượng cố định (được chỉ định bởi hằng số INPUT_QUEUE_SIZE có thể là 30) được phân bổ trong phương thức createInputObjectPool khi hoạt động được tạo, trong khi hàng đợi đầu vào sẽ có số lượng sự kiện đầu vào khác nhau. được cho ăn bởi hoạt động và quay trở lại hàng đợi nhóm sau khi chúng được xử lý bằng phương thức returnToPool. Các hàng đợi này là các ArrayBlockingQueue là các hàng đợi thông thường (lần đầu tiên xuất hiện trước) được triển khai bằng cách sử dụng một mảng (trái ngược với danh sách được liên kết chẳng hạn) sẽ chặn, trong trường hợp hàng đợi bình thường sẽ tràn và tràn, cho đến khi hàng đợi sẵn sàng cho hoạt động.


Câu trả lời tuyệt vời, +2 nếu tôi có thể
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.