Một trò chơi Android nên sử dụng bao nhiêu chủ đề?


28

Tối thiểu, một trò chơi Android OpenGL có một luồng UI và một luồng kết xuất được tạo bởi GLSurfaceView. Renderer.onDrawFrame()nên làm việc tối thiểu để có được FPS cao nhất. Vật lý, AI, v.v. không cần phải chạy mọi khung hình, vì vậy chúng ta có thể đặt chúng vào một luồng khác. Bây giờ chúng tôi có:

  1. Chủ đề kết xuất - Cập nhật hình động và vẽ polys
  2. Chủ đề trò chơi - Logic & vật lý định kỳ, cập nhật AI, v.v.
  3. Giao diện người dùng - Chỉ tương tác với giao diện người dùng Android

Vì bạn không bao giờ muốn chặn luồng UI, tôi chạy thêm một luồng cho logic trò chơi. Có lẽ điều đó không cần thiết mặc dù? Có bao giờ một lý do để chạy logic trò chơi trong luồng kết xuất không?

Câu trả lời:


18

Chris Pruett của Google nói về vấn đề này trong blog Đảo bản sao của anh ấy . Vì eglSwapBuffers () là một cuộc gọi chặn trong luồng GLSurfaceView, nên có mã logic trò chơi trong một luồng khác cho phép nó chạy trong khi lệnh gọi bộ đệm trao đổi đang chặn. Điều này rất quan trọng nếu trò chơi của bạn phức tạp và bạn muốn đạt được 60 khung hình mỗi giây.

Bạn có thể tải xuống mã nguồn cho Đảo bản sao và xem họ đã làm như thế nào. Tôi đã triển khai một cái gì đó tương tự cho trò chơi của tôi (với ba chủ đề bạn đã nói) và nó hoạt động rất tốt.


2

Android hỗ trợ Chủ đề Java tiêu chuẩn. Bạn có thể sử dụng Chủ đề tiêu chuẩn và các công cụ từ gói java.util.conc hiện để đặt các hành động vào nền. Hạn chế duy nhất là bạn không thể cập nhật trực tiếp giao diện người dùng từ quá trình nền.

Nếu bạn cần cập nhật giao diện người dùng từ tác vụ nền, bạn cần sử dụng một số lớp cụ thể của Android. Bạn có thể sử dụng lớp android.os.Handler cho lớp này hoặc lớp AsyncT task.

Để biết thêm chi tiết xin vui lòng kiểm tra liên kết sau ....

http://mindstick.com/Articles/7a9205de-bae7-48ba-81b5-2b2ec161d672/?Thread%20in%20Android

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.