2011-01-30 33 views
5

Tôi đang tìm mẫu mã mẫu cho biết cách đạt được 30 khung hình mỗi giây bằng cách sử dụng Android SurfaceView? Giả sử mỗi khung vẽ một vòng tròn bắt đầu từ vị trí x và y và mỗi khung tăng x và y một.Làm thế nào để đạt được 30 khung hình mỗi giây bằng cách sử dụng Android SurfaceView?

Câu hỏi thưởng: Trên đầu trang ở trên, tôi muốn phủ một Chế độ xem khác để hiển thị nội dung văn bản để bất kỳ đồ họa nào đang được hiển thị bên dưới nội dung văn bản này. Làm thế nào điều này có thể được thực hiện?

Trả lời

3

Make a thread mà thực hiện điều này 30 lần một giây:

  1. SurfaceHolder.lockCanvas Gọi().
  2. Vẽ vào Canvas (phải vẽ lại hoàn toàn tất cả pixel).
  3. Gọi SurfaceHolder.unlockCanvasAndPost().

Thực tế, nếu chuỗi của bạn chỉ ngồi ở đó làm điều đó mà không cố gắng tạm dừng, nó sẽ được điều chỉnh tỷ lệ khung hình của màn hình.

Bạn cần đảm bảo rằng chuỗi này được đồng bộ hóa chính xác với chế độ xem bề mặt - ví dụ nếu bề mặt đang thay đổi hoặc bị hủy, mã của bạn phải đồng bộ hóa với chuỗi để đảm bảo luồng dừng chạy điều này xảy ra.

Tất nhiên điều này có nghĩa là bạn đang thực hiện hiển thị phần mềm vào canvas. Tùy thuộc vào những gì bạn đang làm, điều này có thể tốt để cung cấp cho bạn hoạt ảnh 30fps. Nếu không, bạn sẽ cần sử dụng GLSurfaceView. Bạn có thể muốn xem xét việc sử dụng anyway, chỉ vì nó sẽ chăm sóc phần luồng cho bạn.

+0

Đây có phải là cách tốt nhất để làm điều đó không? – Derzu

6

Nếu bạn muốn có tốc độ khung hình cao, bạn thực sự cần đọc lên trên GLSurfaceView. Dưới một cái nhìn bề mặt bình thường, bạn sẽ được ở lòng thương xót của các tính toán bố trí chi phí và dựng hình trung tâm CPU. Với GLSurfaceView, bạn có thể tải nó lên GPU và kiểm soát chặt chẽ bố cục.

+0

GLSurfaceView chỉ tăng tốc bản vẽ (vì bạn sử dụng OpenGL để vẽ nó). Nó không được loại bỏ các tính toán bố trí ... trên thực tế không bao giờ nên có các phép tính bố trí xảy ra trong quá trình vẽ, thậm chí là vẽ bản phân cấp khung nhìn thông thường. – hackbod

+1

"Nó không loại bỏ tính toán bố cục" - tôi đã nói nó đã làm chưa? "không bao giờ nên có các tính toán bố trí xảy ra trong quá trình vẽ" - Tôi đã không nói điều đó đúng không? Tuy nhiên, nói về ** tỷ lệ khung hình ** thường có nghĩa là một cái gì đó đang di chuyển/thay đổi mà sẽ ảnh hưởng đến tính toán bố trí. Nếu bạn đang sử dụng trình quản lý bố cục gốc, điều này sẽ rất tốn kém. –

+0

Nếu tôi sử dụng GLSurfaceView như trái ngược với SurfaceView, mức độ này sẽ ảnh hưởng đến việc sử dụng pin và ảnh hưởng của việc sử dụng pin đến mức nào nếu thiết bị không có GPU và CPU đang thực hiện tất cả các tác vụ? Người dùng cuối không quan tâm đến các chu kỳ CPU/GPU nhưng họ quan tâm đến lượng pin đang được rút ra bởi ứng dụng.Mục tiêu của tôi là tìm cách tiếp cận sẽ không đặt nhiều hơn một tải hợp lý trên pin. – ace

2

Đây có thể là một chủ đề cũ nhưng tôi nghĩ rằng điều này có thể giúp người khác. Đây là một hướng dẫn tốt đẹp tôi tìm thấy trên sử dụng surfaceView: http://www.droidnova.com/playing-with-graphics-in-android-part-i,147.html

Và đây là một bài viết tốt đẹp về cách thực hiện trò chơi vòng lặp mà có thể giúp hạn chế FPS tới 30: http://www.koonsolo.com/news/dewitters-gameloop/

Bạn có thể thêm văn bản trực tiếp vào SurfaceView của bạn nếu bạn thích, Đây là một ví dụ

public void onDraw(Canvas canvas) { 
    ... 
    // Add text 
    Paint paint = new Paint(); 
    paint.setAntiAlias(true); 
    paint.setFakeBoldText(true);    // if you like bold 
    paint.setShadowLayer(5, 5, 5, Color.GRAY); // add shadow 
    paint.setColor(Color.WHITE); 
    paint.setTextSize(30); 
    canvas.drawText("FPS: " + _fps, 10, 35, paint);    
} 
Các vấn đề liên quan