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 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.
  • 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_syncVkFence).
  • 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

Để đọ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:

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ộ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.