Nhiều tốc độ làm mới

Android 11 hỗ trợ thêm các thiết bị có nhiều tốc độ làm mới. Có 3 thành phần chính cho tính năng này:

  • Các API HAL mới được giới thiệu trong android.hardware.graphics.composer@2.4.
  • Mã nền tảng để phân tích cú pháp cấu hình thiết bị cho nhiều tốc độ làm mới và đặt tốc độ làm mới mong muốn
  • SDK và API NDK mới cho phép ứng dụng đặt tốc độ khung hình mong muốn

Triển khai

Chúng tôi đã thêm tính năng hỗ trợ chuyên biệt cho việc chuyển đổi tốc độ làm mới vào android.hardware.graphics.composer@2.4 HAL. Chúng tôi thực sự khuyên bạn nên sử dụng phiên bản này vì các phiên bản trước của HAL đã hỗ trợ hạn chế việc chuyển đổi tốc độ làm mới.

Nhóm cấu hình

Thêm một thuộc tính mới CONFIG_GROUP vào IComposerClient::Attribute có thể truy vấn bằng API getDisplayAttribute_2_4. Thuộc tính này cho phép nhà cung cấp nhóm các cấu hình hiển thị cùng nhau. Các cấu hình trong cùng một nhóm cho phép chuyển đổi liền mạch giữa chúng trong hầu hết các trường hợp. Nền tảng sử dụng nhóm cấu hình để phân biệt những cấu hình nào có thể chuyển đổi giữa các cấu hình đó nhằm chuyển đổi tốc độ làm mới chứ không phải các thuộc tính khác cho một cấu hình.

Hãy xem xét ví dụ sau đây minh hoạ lợi ích của việc sử dụng nhóm cấu hình với một thiết bị hỗ trợ 4 cấu hình hiển thị:

  • 1080p ở tốc độ 60 Hz
  • 1080p@90Hz
  • 1080i@72Hz
  • 1080i@48Hz

Mặc dù thiết bị hỗ trợ tốc độ làm mới 48Hz, 60Hz, 72Hz và 90Hz, nhưng màn hình hoạt động ở chế độ khác và việc chuyển từ 60Hz sang 72Hz sẽ thay đổi cấu hình màn hình từ 1080p sang 1080i, có thể không phải là hành vi mong muốn. Bạn có thể giải quyết vấn đề này bằng cách sử dụng nhóm cấu hình. Bằng cách nhóm 60Hz và 90Hz với nhau thành một config và 48Hz và 72Hz trong một nhóm cấu hình khác. Nền tảng này biết rằng nó có thể chuyển đổi giữa 60Hz và 90Hz và giữa 48Hz và 72Hz nhưng không giữa 60Hz và 72Hz vì điều này sẽ dẫn đến thay đổi cấu hình thay vì chỉ thay đổi tốc độ làm mới.

Nội dung cập nhật về Composer API

nhậnDisplayVsyncPeriod
Để kiểm soát và dự đoán tốt hơn khi thay đổi tốc độ làm mới, chúng tôi đã thêm getDisplayVsyncPeriod . getDisplayVsyncPeriod trả về tốc độ làm mới hiện tại (xét về vsync) mà màn hình hoạt động lúc. Điều này đặc biệt hữu ích trong khi chuyển đổi giữa tốc độ làm mới và tốc độ làm mới hiện tại mà nền tảng cần để quyết định thời điểm bắt đầu khung tiếp theo.
setActiveConfigWithConstraints
Phương thức setActiveConfigWithConstraints là một phần mở rộng mới cho phương thức setActiveConfig hiện tại và cung cấp thêm thông tin về thay đổi cấu hình. Các quy tắc ràng buộc được cung cấp trong tham số vsyncPeriodChangeConstraints và chứa các tham số sau.
    desiredTimeNanos
    Thời gian trong CLOCK_MONOTONIC sau đó khoảng thời gian vsync có thể thay đổi (tức là khoảng thời gian vsync không được thay đổi trước thời điểm này). Điều này rất hữu ích khi nền tảng muốn lên kế hoạch trước cho việc thay đổi tốc độ làm mới nhưng đã có một số vùng đệm trong hàng đợi để hiển thị. Nền tảng đặt thời gian này một cách phù hợp để tính đến các vùng đệm đó và đảm bảo rằng quá trình chuyển đổi tốc độ làm mới sẽ suôn sẻ nhất có thể.
    liền mạchYêu cầu
    Nếu đúng, yêu cầu thay đổi khoảng thời gian vsync phải diễn ra liền mạch mà không có hiện tượng hình ảnh đáng chú ý. Cờ này được nền tảng sử dụng khi là cần thiết để thay đổi tốc độ làm mới do thay đổi nội dung (ví dụ: thiết bị ở trạng thái rảnh và ảnh động bắt đầu). Điều này giúp nhà cung cấp có cơ hội không cho phép một số thay đổi cấu hình nhất định khi những thay đổi đó có thể dẫn đến hiện tượng hình ảnh đáng chú ý. Nếu hệ thống không thể thay đổi cấu hình một cách liền mạch và seamlessRequired được đặt thành true, cách triển khai là được dự kiến sẽ trả về SEAMLESS_NOT_POSSIBLE làm mã trả lại và gọi lệnh gọi lại onSeamlessPossible mới khi cùng cấu hình thay đổi có thể được thực hiện liền mạch.

Khi thành công, quá trình triển khai sẽ trả về một VsyncPeriodChangeTimeline cho nền tảng biết thời điểm dự kiến thay đổi tốc độ làm mới xảy ra. newVsyncAppliedTimeNanos thông số cần được đặt thành thời gian trong CLOCK_MONOTONIC khi màn hình mới sẽ bắt đầu làm mới vào khoảng thời gian vsync mới. Điều này, cùng với desiredTimeNanos cho phép nền tảng lên kế hoạch trước cho quá trình làm mới chuyển đổi tốc độ và bắt đầu tích hợp ứng dụng cho tốc độ làm mới mới trước. Chiến dịch này cho phép chuyển đổi liền mạch tốc độ làm mới.

Một số phương thức triển khai yêu cầu phải gửi khung làm mới trước khi có thể gửi tốc độ làm mới. Để làm được điều đó, HAL có refreshRequired để cho biết rằng cần khung làm mới và refreshTimeNanos để cho biết vsync đầu tiên trong đó khung làm mới cần được gửi sau.

onVsyncPeriodTimingChanged [lệnh gọi lại]
Một lệnh gọi lại mới mà HAL có thể gọi để cho nền tảng biết rằng một số tham số của dòng thời gian đã thay đổi nên nền tảng cần điều chỉnh dòng thời gian. Lệnh gọi lại này dự kiến sẽ được gọi nếu vì lý do nào đó mà tiến trình cũ bị bỏ lỡ do thời gian xử lý lâu trên HAL hoặc khung làm mới muộn.

Nền tảng này quyết định thay đổi tốc độ làm mới như thế nào?

Lựa chọn tốc độ làm mới sẽ diễn ra trong 2 dịch vụ hệ thống sau đây:

Trình quản lý màn hình
DisplayManager đặt chính sách cấp cao liên quan đến tốc độ làm mới. Cửa sổ này đặt cấu hình hiển thị mặc định, giống như cấu hình HAL của trình soạn thảo. Ngoài ra, nó còn đặt phạm vi tối thiểu và tối đa các giá trị cho SurfaceFlinger để chọn làm mới .
SurfaceFlinger
Xác định tốc độ làm mới bằng cách thiết lập một cấu hình nằm trong cùng cấu hình làm cấu hình mặc định và có tốc độ làm mới trong phạm vi tối thiểu/tối đa dải ô.

Trình quản lý hiển thị sẽ chạy qua các bước sau đây để xác định chính sách của Google:

  • Tìm mã nhận dạng cấu hình mặc định bằng cách truy vấn cấu hình đang hoạt động từ SurfaceFlinger
  • Hạn chế phạm vi giá trị tối thiểu và tối đa bằng cách lặp lại các điều kiện hệ thống
    • Cài đặt tốc độ làm mới mặc định: Giá trị tốc độ làm mới mặc định được đặt trong lớp phủ cấu hình R.integer.config_defaultRefreshRate. Giá trị này được dùng để xác định tốc độ làm mới thiết bị tiêu chuẩn cho ảnh động và các lượt tương tác chạm.
    • Chế độ cài đặt tốc độ làm mới cao nhất: Giá trị tốc độ làm mới cao nhất được đọc từ Settings.System.PEAK_REFRESH_RATE. Giá trị này là đã thay đổi trong thời gian chạy để phản ánh chế độ cài đặt hiện tại của thiết bị (chẳng hạn như từ một trình đơn ). Giá trị mặc định được đặt trong Lớp phủ cấu hình R.integer.config_defaultPeakRefreshRate.
    • Chế độ cài đặt tốc độ làm mới tối thiểu: Giá trị tốc độ làm mới tối thiểu được đọc từ Settings.System.MIN_REFRESH_RATE. Bạn có thể thay đổi giá trị này trong thời gian chạy để phản ánh chế độ cài đặt thiết bị hiện tại (chẳng hạn như từ một tuỳ chọn trình đơn). Giá trị mặc định là 0, do đó không có giá trị tối thiểu mặc định.
    • Mã chế độ theo yêu cầu của ứng dụng: Ứng dụng có thể đặt WindowManager.LayoutParams.preferredDisplayModeId để phản ánh cấu hình ưu tiên mà màn hình sẽ hoạt động. Trong hầu hết các điều kiện DisplayManager đặt mã cấu hình mặc định theo đó, đồng thời đặt tốc độ làm mới tối thiểu và tối đa sao cho khớp với tốc độ làm mới.
    • Trình tiết kiệm pin: Tốc độ làm mới bị giới hạn ở 60Hz hoặc thấp hơn khi thiết bị ở chế độ tiết kiệm pin (được biểu thị qua Settings.Global.LOW_POWER_MODE.

Sau khi DisplayManager đặt chính sách, SurfaceFlinger sẽ đặt tốc độ làm mới dựa trên các lớp đang hoạt động (các lớp xếp hàng cập nhật khung). Nếu chủ sở hữu của lớp đặt tốc độ khung hình, SurfaceFlinger cố gắng đặt tốc độ làm mới thành hệ số nhân của tốc độ đó. Ví dụ: nếu hai lớp đang hoạt động đặt tốc độ khung hình thành 24 và 60, thì SurfaceFlinger sẽ chọn 120Hz nếu có. Nếu tốc độ làm mới đó không áp dụng cho SurfaceFlinger, hệ thống sẽ cố gắng chọn tốc độ làm mới có lỗi tốc độ khung hình. Để biết thêm thông tin, hãy xem tài liệu dành cho nhà phát triển trên developer.android.com

SurfaceFlinger duy trì các cờ sau để kiểm soát cách quyết định tốc độ làm mới:

  • ro.surface_flinger.use_content_detection_for_refresh_rate: Nếu bạn đặt tốc độ làm mới, tốc độ này sẽ được quyết định dựa trên các lớp đang hoạt động, ngay cả khi bạn không đặt tốc độ khung hình. SurfaceFlinger duy trì phương pháp phỏng đoán khi tìm thấy tốc độ khung hình/giây trung bình mà lớp đang đăng vùng đệm xem dấu thời gian trình bày đi kèm với vùng đệm.
  • ro.surface_flinger.set_touch_timer_ms: nếu > 0, tốc độ làm mới mặc định sẽ được sử dụng khi người dùng chạm vào màn hình trong khoảng thời gian chờ đã định cấu hình. Phương pháp phỏng đoán này được thực hiện để sẵn sàng với tốc độ làm mới mặc định cho ảnh động.
  • ro.surface_flinger.set_idle_timer_ms: nếu > 0, tốc độ làm mới tối thiểu sẽ được sử dụng khi không có bản cập nhật màn hình nào cho thời gian chờ đã định cấu hình.
  • ro.surface_flinger.set_display_power_timer_ms: nếu > 0, thì tốc độ làm mới mặc định sẽ được sử dụng khi bật màn hình (hoặc khi thoát khỏi AOD) trong khoảng thời gian chờ đã định cấu hình.

API Tốc độ khung hình

API tốc độ khung hình cho phép các ứng dụng cung cấp thông tin cho nền tảng Android về dự định của các ứng dụng đó tốc độ khung hình và có trên những ứng dụng nhắm đến Android 11. Để tìm hiểu thêm về API tốc độ khung hình, hãy xem tài liệu dành cho nhà phát triển trên developer.android.com.

Tuỳ chọn cho nhà phát triển

Trình đơn đã thêm một tuỳ chọn mới dành cho nhà phát triển để bật/tắt lớp phủ trên màn hình bằng tốc độ làm mới hiện tại. Tuỳ chọn mới nằm trong phần Cài đặt > Hệ thống > Tuỳ chọn cho nhà phát triển > Hiện tốc độ làm mới.