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 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á logic và vòng lặp kết xuất của trò chơi với hệ thống hiển thị phụ và phần cứng hiển thị cơ bản của hệ điều hành. Màn hình Android hệ thống con được thiết kế để tránh một số thành phần hình ảnh nhất định, chẳng hạn như hiện tượng xé hình. Chiến lược phát hành đĩa đơn hệ thống hiển thị phụ sẽ tránh hiện tượng xé hình bằng cách thực hiện những việc sau:
- Lưu các khung hình trước đây vào bộ đệm 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 một 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ỷ lệ khác với tỷ lệ mà phần cứng màn hình gốc hỗ trợ. Có vấn đề phát sinh khi vòng lặp kết xuất của một 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 ở 30 khung hình/giây cố gắng hiển thị trên 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 khiến một khung hình lặp lại duy trì trên màn hình trong 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 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. Những cảnh quá phức tạp sẽ kết hợp lại sự cố này vì chúng khiến việc bỏ lỡ khung hình.
Thư viện Frame Pacing thực hiện những việc sau:
- Bù lại tình trạng giật hình 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 chiếu đúng thời điểm 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ễ.
- Thao tác chèn sẽ chờ vào ứng dụng. Các điều kiện này cho phép quy trình hiển thị nắm bắt thay vì tạo áp lực ngược.
- 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 tính linh hoạt và hình thức 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à phân tích bằng khung số liệu thống kê.
Để tìm hiểu cách định cấu hình thư viện để hoạt động ở các chế độ khác nhau theo với những gì bạn cần, hãy xem 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 phần Đạt đúng tốc độ khung hình.
Biện pháp can thiệp điều tiết khung hình/giây
Chế độ can thiệp điều tiết khung hình/giây (FPS) giúp trò chơi có tốc độ khung hình/giây phù hợp chỉ sử dụng phía nền tảng thay đổi mà không yêu cầu bất kỳ hành động nào đối với nhà phát triển phần.
Quy trình triển khai biện phá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ả các lượt chuyển đổi cho mỗi người dùng
thông tin theo từng trò chơi về chế độ trò chơi và sự can thiệp của trò chơi. Thông tin FPS được lưu trữ trong
GameManagerService cùng với thông tin về biện pháp can thiệp khác, chẳng hạn như hệ số giảm quy mô độ phân giải,
trong ánh xạ <PACKAGE_NAME, Interventions>
cho từng hồ sơ người dùng.
Thông tin khung hình trên giây đượ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. Đáp
UID
là duy nhất cho mỗi PACKAGE_NAME
và người dùng và có thể được dịch thêm
thành một cặp <UID, Frame Rate>
để gửi đến SurfaceFlinger.
Lớp phủ bề mặt
Thành phần SurfaceFlinger đã hỗ trợ điều tiết FPS 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 đối với đoạn mã được điều tiết bằng cách xác minh xem dấu thời gian vsync có đúng giai đoạn với tốc độ khung hình của . Nếu tốc độ khung hình không cùng pha với vsync, thì SurfaceFlinger sẽ lưu giữ cho đến khi tốc độ khung hình và vsync cùng pha nhau.
Hình sau đây mô tả sự tương tác giữa GameManagerService và SurfaceFlinger:
SurfaceFinger duy trì một liên kết cặp <UID, Frame Rate>
để thiết lập một
mức độ ưu tiên điều tiết tốc độ khung hình. UID
là duy nhất giữa người dùng và trò chơi, để mỗi người dùng
người dùng sử dụng một thiết bị có thể có nhiều chế độ cài đặt tốc độ khung hình trên cùng một trò chơi. Để điều tiết
tốc độ khung hình của một trò chơi, GameServiceManager gọi SurfaceFlinger để ghi đè tốc độ khung hình cho
một UID. Với cơ chế này, SurfaceFlinger cập nhật bản đồ 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 (khung hình/giây)
bằng cách chốt bộ đệm cho phù hợp.
Để tìm hiểu thêm về chế độ điều tiết FPS, hãy xem Giới thiệu về chế độ điều tiết FPS.