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 OpenGL và Vulkan đạ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 trò chơi và kết xuất đồ hoạ với hệ thống hiển thị phụ của hệ điều hành và phần cứng hiển thị cơ bản. Hệ thống hiển thị phụ của Android được thiết kế để tránh một số hiện tượng hình ảnh nhất định, chẳng hạn như hiện tượng xé hình. Hệ thống hiển thị phụ tránh hiện tượng xé hình bằng cách làm như sau:
- Đệm các khung hình trước đây trong nội bộ
- Phát hiện khung hình gửi trễ
- 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ợ. Sự cố xảy ra khi vòng lặp kết xuất của trò chơi chạy quá chậm so 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 đang 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, thì 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 vẫn còn trên màn hình thêm 16 mili giây. Loại sự cố ngắt kết nối này tạo ra sự không nhất quán đáng kể về thời gian kết xuất khung hình, chẳng hạn như 33 mili giây, 16 mili giây, 49 mili giây, v.v. 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 các tác vụ sau:
- Bù cho tình trạng giật do khung hình trò chơi ngắn.
- Thêm dấu thời gian trình bày để khung hình được trình bày đúng giờ, không sớm.
- Sử dụng tiện ích về dấu thời gian trình bày
EGL_ANDROID_presentation_time
vàVK_GOOGLE_display_timing
.
- 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_sync
vàVkFence
).
- Chọn tốc độ làm mới để mang lại sự linh hoạt và khả năng hiển thị 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 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 ở nhiều chế độ 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
- Tích hợp Android Frame Pacing vào trình kết xuất OpenGL
- Tích hợp Android Frame Pacing vào trình kết xuất Vulkan
Để đọc thêm, hãy xem bài viết Đạt được tốc độ khung hình phù hợp.
Can thiệp điều tiết khung hình/giây
Tính năng can thiệp điều tiết số khung hình trên giây (FPS) cho phép trò chơi chạy ở tốc độ khung hình phù hợp mà chỉ cần 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 làm gì cả.
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ì tất cả thông tin về chế độ trò chơi và hoạt động can thiệp vào trò chơi cho mỗi người dùng và mỗi trò chơi. Thông tin 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 bản đồ <PACKAGE_NAME, Interventions>
cho mỗi hồ sơ người dùng.
Thông tin FPS được truy cập khi chế độ trò chơi thay đổi hoặc biện pháp 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ể được dịch thành một cặp <UID, Frame Rate>
để gửi đến SurfaceFlinger.
SurfaceFlinger
Thành phần SurfaceFlinger đã hỗ trợ việc điều tiết FPS của một ứng dụng, miễn là tốc độ khung hình là bộ chia 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 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 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 đồ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ả hoạt động tương tác giữa GameManagerService và SurfaceFlinger:

Hình 1. Hoạt động tương tác giữa GameServiceManager và SurfaceFlinger
SurfaceFinger duy trì mối liên kết cặp <UID, Frame Rate>
để đặt mức độ ưu tiên điều tiết tốc độ khung hình mới. UID
là duy nhất giữa người dùng và trò chơi, để 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 tiết tốc độ khung hình của trò chơi, GameServiceManager 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 mối liên kết bất cứ khi nào chế độ trò chơi thay đổi hoặc biện pháp can thiệp được cập nhật. SurfaceFlinger xử lý thay đổi về FPS bằng cách khoá bộ đệm cho phù hợp.
Để hiểu thêm về tính năng điều tiết FPS, hãy xem bài viết Giới thiệu về tính năng điều tiết FPS.