Tốc độ khung hình

Thư viện Android Frame Pacing, còn được gọi là Swappy, là một phần của Android Game SDK . Nó giúp các trò chơi OpenGLVulkan đạt được kết xuất mượt mà và tốc độ khung hình chính xác trên Android.

Tốc độ khung hình là sự đồng bộ hóa vòng lặp kết xuất và logic của trò chơi với hệ thống con hiển thị của hệ điều hành và phần cứng hiển thị cơ bản. Hệ thống con hiển thị Android được thiết kế để tránh một số hiện tượng giả hình nhất định, chẳng hạn như hiện tượng xé hình. Hệ thống con hiển thị tránh bị rách bằng cách thực hiện như sau:

  • Đang đệm các khung hình quá khứ trong nội bộ
  • Phát hiện việc gửi khung muộn
  • Tiếp tục hiển thị khung hình hiện tại khi phát hiện khung hình muộn

Thời gian hiển thị khung hình không nhất quán là do vòng lặp kết xuất của trò chơi chạy ở tốc độ khác với tốc độ mà phần cứng màn hình gốc hỗ trợ. Sự cố phát sinh khi vòng lặp kết xuất của trò chơi chạy quá chậm đối với phần cứng hiển thị bên dưới, dẫn đến thời gian hiển thị không nhất quán. Ví dụ: khi một trò chơi chạy ở tốc độ 30 khung hình/giây cố gắng hiển thị trên một thiết bị vốn hỗ trợ 60 khung hình/giây, vòng lặp kết xuất của trò chơi sẽ khiến khung hình lặp lại tồn tại trên màn hình thêm 16 mili giây. Kiểu ngắt kết nối này tạo ra sự không nhất quán đáng kể về thời gian khung hình, chẳng hạn như 33 mili giây, 16 mili giây, 49 mili giây, v.v. Những cảnh quá phức tạp càng làm cho vấn đề này trở nên phức tạp hơn vì chúng gây ra hiện tượng bỏ lỡ các khung hình.

Thư viện Tốc độ khung hình thực hiện các tác vụ sau:

  • Bù lại tình trạng giật hình do khung hình game ngắn.
  • Sử dụng hàng rào đồng bộ hóa cho các khung hình dài dẫn đến tình trạng giật hình và độ trễ.
    • Tiêm chờ vào ứng dụng. Những điều này cho phép đường ống hiển thị bắt kịp, thay vì tạo ra áp suất ngược.
    • Sử dụng hàng rào đồng bộ hóa ( EGL_KHR_fence_syncVkFence ).
  • Chọn tốc độ làm mới để mang lại sự linh hoạt và trình bày mượt mà nếu thiết bị của bạn hỗ trợ nhiều tốc độ làm mới.
  • Cung cấp số liệu thống kê để gỡ lỗi và lập hồ sơ bằng cách sử dụng số liệu thống kê khung .

Để tìm hiểu cách định cấu hình thư viện để hoạt động ở các chế độ khác nhau tùy theo nhu cầu của bạn, hãy xem Các chế độ vận hành được hỗ trợ .

Để triển khai bằng trình kết xuất OpenGL hoặc trình kết xuất Vulkan, hãy xem

Để đọc thêm, hãy xem Đạt được tốc độ khung hình phù hợp .

Can thiệp điều tiết khung hình trên giây

Can thiệp điều chỉnh khung hình trên giây (FPS) cho phép trò chơi đạt tốc độ FPS thích hợp chỉ bằng cách sử dụng các thay đổi phía nền tảng và không yêu cầu bất kỳ hành động nào từ phía nhà phát triển.

Việc triển khai can thiệp điều chỉnh FPS sử dụng các thành phần sau:

Dịch vụ quản lý trò chơi

Thành phần GameManagerService duy trì tất cả thông tin của mỗi người dùng và mỗi trò chơi về chế độ trò chơi và sự can thiệp vào trò chơi. Thông tin FPS được lưu trữ trong GameManagerService cùng với thông tin can thiệp khác, chẳng hạn như hệ số giảm tỷ lệ độ phân giải, trong ánh xạ <PACKAGE_NAME, Interventions> cho từng hồ sơ người dùng. Thông tin FPS được truy cập khi chế độ trò chơi được thay đổi hoặc sự can thiệp được cập nhật. UID là duy nhất cho mỗi PACKAGE_NAME và người dùng, đồng thời có thể dịch thành cặp <UID, Frame Rate> để gửi tới SurfaceFlinger.

bề mặtFlinger

Thành phần SurfaceFlinger đã hỗ trợ điều chỉnh FPS của ứng dụng miễn là tốc độ khung hình là ước số của tốc độ làm mới màn hình. Trong trường hợp có vsync, SurfaceFlinger sẽ kiểm tra tính hợp lệ của vsync đối với ứng dụng được điều chỉnh bằng cách xác minh xem dấu thời gian vsync có cùng pha với tốc độ khung hình của ứng dụng hay không. Nếu tốc độ khung hình không cùng pha với vsync thì SurfaceFlinger sẽ giữ khung hình cho đến khi tốc độ khung hình và vsync cùng pha.

Hình sau đây mô tả sự tương tác giữa GameManagerService và SurfaceFlinger:

Tương tác giữa GameManagerService và SurfaceFlinger

Hình 1. Tương tác giữa GameServiceManager và SurfaceFlinger

SurfaceFinger duy trì ánh xạ cặp <UID, Frame Rate> để đặt mức độ ưu tiên điều chỉnh tốc độ khung hình mới. UID là duy nhất giữa người dùng và trò chơi, do đó mỗi người dùng trên một thiết bị có thể có các cài đặt tốc độ khung hình khác nhau trên cùng một trò chơi. Để điều chỉnh tốc độ khung hình của trò chơi, GameServiceManager gọi SurfaceFlinger để ghi đè tốc độ khung hình cho UID. Với cơ chế này, SurfaceFlinger cập nhật bản đồ bất cứ khi nào chế độ trò chơi được thay đổi hoặc cập nhật can thiệp. SurfaceFlinger xử lý sự thay đổi FPS bằng cách chốt bộ đệm tương ứng.

Để hiểu thêm về điều chỉnh FPS, hãy xem phần giới thiệu điều chỉnh FPS .