2012-02-14 20 views
11

Từ những gì tôi đã thấy, nếu tôi muốn tạo vòng lặp trò chơi không phải là những gì tôi có thể làm là có một chuỗi trò chơi trong vòng lặp sẽ cập nhật trạng thái trò chơi (hoặc trò chơi vật lý) và cũng cập nhật đồ họa bằng cách khóa một số Canvas từ một (bình thường) SurfaceView, thực hiện thao tác vẽ qua phương thức Canvas.drawXXX (...) và sau đó mở khóa tại thời điểm đồ họa được cập nhật cho vòng lặp.Cách tốt nhất để tạo vòng lặp trò chơi cho Android sử dụng OpengGLSurface

Tôi thực sự không biết cách thực hiện điều đó khi sử dụng GLSurfaceViewRenderer. Từ những gì tôi hiểu, tôi không thể có gameThread do tay tạo ra theo yêu cầu như tôi đã có với bề mặt thông thường và nó là Canvas, bởi vì bây giờ có một chuỗi hiển thị sẽ gọi Renderer.onDrawFrame() (trên thực hiện của tôi về lớp kết xuất mà tôi vượt qua vào GLSurfaceView).

Câu hỏi của tôi là, cách tốt nhất để tạo vòng lặp trò chơi bằng GLSurfaceView và Trình kết xuất đồ họa là gì? Tôi có nên tạo chuỗi trò chơi riêng, nhưng chỉ xử lý cập nhật trạng thái trò chơi (vật lý) trong đó và sau đó sử dụng trạng thái trò chơi đó trong việc thực hiện Renderer.onDrawFrame() để vẽ đồ họa dựa trên trạng thái hiện tại? Tôi có nên chỉ sử dụng chuỗi của Rendere để cập nhật trạng thái không?

Trả lời

5

Vâng, khi nó quay ra, cách tốt nhất để đi là sử dụng chuỗi được cung cấp bởi GLSurface. Móc nối đến nó thông qua việc triển khai giao diện Renderer. Có hiệu quả phương thức onDrawFrame() của Renderer có thể được coi là tương tự với phương thức run() của Thread. Loại hình này ném ra ngoài cửa sổ khái niệm về một bản cập nhật cố định trên một mô hình thứ hai (không thực sự, nhưng nó quá phức tạp để làm trong bối cảnh này) nhưng mặt khác bạn sẽ nhận được các bản cập nhật đồ họa tối ưu.

Có một hướng dẫn tuyệt vời trên Android và OpenGL ở đây:

http://insanitydesign.com/wp/projects/nehe-android-ports/

+0

Vì vậy, bằng cách sử dụng onDrawFrame() là "cập nhật" của trò chơi của bạn không phải là thói quen xấu? Tôi vừa tạo ra một trò chơi - đẩy một 60FPS trơn tru không có bộ nhớ allocs và đã nghĩ rằng tôi có lẽ nên chia chủ đề của tôi. – torger

+1

Vâng, chỉ sử dụng chuỗi của GLSurface có nghĩa là trò chơi của bạn sẽ có 2 chủ đề chính: chuỗi chính, trong cài đặt này chủ yếu sẽ xử lý giao diện người dùng và chủ đề GLSurface sẽ cập nhật trạng thái trò chơi và đồ họa của bạn. Tôi đã sử dụng thiết lập này và nó hoạt động tốt. Bạn chỉ cần cẩn thận cách bạn chuyển đầu vào của người dùng từ chuỗi chính đến chuỗi GLSurface (tránh điều kiện chủng tộc). Khác hơn thế, tôi đã nhìn thấy một số thiết lập kỳ lạ, nơi bạn có một chủ đề thứ 3 (hoặc thậm chí nhiều hơn) để xử lý các công cụ khác, nhưng tôi không bao giờ cảm thấy cần thiết cho nó. –

+0

Cách tiếp cận tốt nhất, thẳng thắn, là không sử dụng GLSurfaceView. Sử dụng kế hoạch SurfaceView cũ và tự mình thiết lập và quản lý luồng. Đó là công việc nhiều hơn, nhưng bạn có thể nhận được kết quả tốt hơn. Một cuộc thảo luận dài hơn về các vòng trò chơi Android có sẵn tại đây: https://source.android.com/devices/graphics/architecture.html#loops. Mã mẫu trong Grafika (https://github.com/google/grafika). – fadden