Tốc độ khung hình

Thư viện Android Frame Pacing (còn gọi là Swappy) là một phần của SDK cho trò chơi Android. Thư viện này giúp các trò chơi OpenGLVulkan đạt được khả năng kết xuất hình ảnh 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ộ hoá vòng lặp logic và kết xuất đồ hoạ 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 bất thường về hình ảnh, chẳng hạn như hiện tượng xé hình. Hệ thống con hiển thị tránh hiện tượng xé hình bằng cách thực hiện những việc sau:

  • Đệm các khung hình trước đây trong nội bộ
  • Phát hiện khung hình gửi chậm
  • Tiếp tục hiển thị khung hình hiện tại khi phát hiện thấy khung hình trễ

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 hiển thị gốc hỗ trợ. Vấn đề 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ị cơ bản, 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 kết xuất trên một thiết bị vốn hỗ trợ tốc độ 60 khung hình/giây, vòng lặp kết xuất của trò chơi sẽ khiến một khung hình lặp lại tồn tại trên màn hình thêm 16 mili giây. Loại sự cố này tạo ra những điểm 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 và 49 mili giây. Các cảnh quá phức tạp có thể gây ra vấn đề phức tạp hơn nữa vì có thể làm xảy ra việc bỏ lỡ các khung hình.

Thư viện Frame Pacing thực hiện những việc sau:

  • Bù đắp tình trạng kết xuất gián đoạn do khung hình trò chơi ngắn.
  • Sử dụng hàng rào đồng bộ hoá cho các khung hình dài dẫn đến tình trạng kết xuất gián đoạn và trễ.
    • Chèn các lệnh chờ vào ứng dụng. Các lệnh này cho phép quy trình hiển thị bắt kịp, thay vì để cho áp lực ngược tăng lên.
    • Sử dụng hàng rào đồng bộ hoá (EGL_KHR_fence_syncVkFence).
  • Chọn tốc độ làm mới để mang lại tính linh hoạt và bản 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ê về khung hình.

Để tìm hiểu cách định cấu hình thư viện hoạt động ở các chế độ khác nhau theo nhu cầu của bạn, hãy xem phần Các chế độ hoạt động đượ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 thư viện Frame Pacing.

Biện pháp can thiệp điều tiết số khung hình mỗi giây

Biện pháp can thiệp điều tiết tốc độ khung hình (FPS) cho phép các trò chơi chạy ở tốc độ khung hình 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 nhà phát triển thực hiện bất kỳ hành động nào.

Việc triển khai biện pháp can thiệp điều tiết FPS sử dụng các thành phần sau.

GameManagerService

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

SurfaceFlinger

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

Hình sau đây mô tả mối 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ì một cặp <UID, Frame Rate> ánh xạ để đặt mức độ ưu tiên điều chỉnh tốc độ khung hình mới. UID là giá trị riêng biệ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 chế độ 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 một trò chơi, GameServiceManager sẽ gọi SurfaceFlinger để ghi đè tốc độ khung hình cho một UID. Với cơ chế này, SurfaceFlinger sẽ cập nhật hoạt động ánh xạ bất cứ khi nào chế độ trò chơi thay đổi hoặc chế độ can thiệp được cập nhật. SurfaceFlinger xử lý việc thay đổi FPS bằng cách chốt các vùng đệm tương ứng.

Để tìm hiểu thêm về chế độ điều tiết FPS, hãy xem phần Điều tiết FPS.