2013-01-10 9 views
6

Đối với trò chơi của tôi, tôi đang nghĩ đến việc vẽ các yếu tố giao diện người dùng (TextView để hiển thị thời gian trôi qua, Buttons cho tạm dừng/khởi động lại trò chơi) trên đầu trang của GLSurfaceView tôi sử dụng RelativeLayout ...Vẽ Android UI trên đầu trang của GLSurfaceView

Till Bây giờ, tôi đã vẽ tất cả các yếu tố giao diện người dùng trực tiếp lên SurfaceView nhưng xem xét các tùy chọn có sẵn từ giao diện người dùng Android (như thay đổi kiểu chữ và màu), tôi đã quyết định sử dụng nó.

Câu hỏi:

  • Có thực hành tốt để vẽ các yếu tố giao diện người dùng trên đầu trang của GLSurfaceView hoặc là nó tốt hơn để vẽ tất cả những thứ UI bản thân mình trực tiếp đến GLSurfaceView?
  • Tôi sẽ cập nhật nội dung của các thành phần giao diện người dùng (Nói TextView) thường xuyên (đối với mỗi 16 ms) bằng cách sử dụng phương pháp runOnUiThread() ... Điều này có tệ không?
  • Trò chơi của tôi có dễ bị ảnh hưởng bởi Force Closes không?

Đây là mã java thử nghiệm mà tôi đang sử dụng để thiết lập RelativeLayout ... glView là phiên bản GLSurfaceView.

rl = new RelativeLayout(this); 
    rl.addView(glView);   
    tv = new TextView(this); 
    RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
    lp.addRule(RelativeLayout.ALIGN_TOP); 
    tv.setLayoutParams(lp); 
    tv.setText("FPS: 0"); 
    tv.setBackgroundColor(0x4060ff70); 
    rl.addView(tv); 

    setContentView(rl); 

Trả lời

3
  • Có thực hành tốt để vẽ các yếu tố giao diện người dùng trên đầu trang của GLSurfaceView hoặc là nó tốt hơn để vẽ tất cả những thứ UI bản thân mình trực tiếp đến GLSurfaceView?

Có vẻ như một ý tưởng hay khi vẽ điều khiển Android trên đầu trang của GLSurfaceView nếu bạn mong muốn sự linh hoạt mà hệ thống bố cục Android cung cấp. Cảnh báo mặc dù các điều khiển này có thể được rút ra chậm hơn nhiều so với glSurfaceView của bạn, vì vậy hãy đảm bảo giao diện người dùng không cần quá nhiều đồ họa để hiển thị và không cập nhật quá nhanh.

Tự hiển thị mọi thứ là một tùy chọn, nhưng sau đó bạn mất tất cả các tính năng bạn có thể nhận được từ hệ thống giao diện người dùng Android.

  • tôi sẽ cập nhật nội dung của các yếu tố giao diện người dùng (Say TextView) thường xuyên (đối với mỗi 16 ms) bằng cách sử dụng phương pháp runOnUiThread() ... Đây có phải là xấu?

Nghe có vẻ ổn với tôi.

  • Trò chơi của tôi có dễ bị ảnh hưởng không?

Điều này không liên quan gì đến các câu hỏi khác. Nếu bạn làm theo đúng cách sử dụng và không gây ra ngoại lệ được ném, thì bạn sẽ ổn thôi. Nếu bạn gây ra ngoại lệ thì ứng dụng của bạn sẽ bị buộc phải đóng (trừ khi bạn xử lý đúng các trường hợp ngoại lệ).

2

Tôi thực hiện việc này trong trò chơi Android mà tôi đang thực hiện để tôi nghĩ mình sẽ chia sẻ trải nghiệm của mình với nó.

Thực hành tốt để vẽ các phần tử giao diện người dùng trên đầu trang của GLSurfaceView hoặc là tự động vẽ trực tiếp tất cả nội dung giao diện người dùng trực tiếp đến GLSurfaceView?

Cá nhân tôi nghĩ rằng thực tiễn tốt là sử dụng tiện ích con UI trong xây dựng mà Android cung cấp cho bạn để vẽ giao diện người dùng của mình. Có một số tình huống mà nó sẽ không phù hợp, ví dụ: Các điều khiển giao diện người dùng có thể được kéo xung quanh khu vực trò chơi của bạn hoặc các hoạt ảnh hoặc hành vi phức tạp.

Nếu bạn sau các nút và textViews thì tôi đề xuất phương pháp bạn đề xuất.

tôi sẽ cập nhật nội dung của các yếu tố giao diện người dùng (Say TextView) thường xuyên (đối với mỗi 16 ms) bằng cách sử dụng phương pháp runOnUiThread() ... Là này xấu?

Trò chơi của tôi có dễ bị ảnh hưởng bởi Force Closes không?

Tôi sử dụng cùng một hệ thống để cập nhật các thành phần giao diện người dùng của mình. Tôi không cần phải cập nhật thường xuyên như mọi 16ms nhưng tôi chắc chắn không có bất kỳ vấn đề nào với lực đóng hoặc giao diện người dùng không phản hồi.

Nếu bạn có nhiều thành phần (tôi đang nói 10-20 +) đang được cập nhật thường xuyên này thì có thể bạn có thể gặp sự cố giao diện người dùng không phản hồi.

Bạn có cần cập nhật chế độ xem mỗi 16ms (khoảng 60FPS) không? Bạn có thể cập nhật giá trị cơ bản để duy trì logic chính xác nhưng chỉ cập nhật Xem mỗi 20-30FPS để giảm số tiền chạy trên chuỗi giao diện người dùng, nếu cần.

Tôi nghĩ rằng giao diện người dùng không cần phải được cập nhật thường xuyên như chế độ xem OpenGL của bạn vì bạn không có mọi thứ đang diễn ra trong cùng một cách. Nếu một textView cập nhật 20 lần mỗi giây, bạn sẽ vẫn cảm nhận được nó thay đổi liên tục.

+0

Có ... Làm cho tinh thần .. bạn sẽ xem xét xem câu hỏi khác tôi đã đăng một lúc trước? http://stackoverflow.com/questions/14522715/passing-instructions-from-ui-thread-to-rendering-thread-glsurfaceview – BLOB