Khi một ảnh động được khởi tạo trong Android, màn hình thường tăng lên tốc độ làm mới tối đa để đảm bảo trải nghiệm mượt mà. Đối với ảnh động nhỏ như thanh tiến trình và trình tạo hình ảnh âm thanh, tốc độ làm mới cao này là không cần thiết và dẫn đến mức tiêu thụ điện năng cao.
Kể từ Android 15, với tính năng tốc độ làm mới thích ứng (ARR), các thiết bị đã bật tính năng này có thể giảm thời gian ở trạng thái tốc độ làm mới cao trên hai phương diện:
- Với các tính năng tối ưu hoá mới về quản lý tốc độ khung hình của nền tảng, các ứng dụng có thể kết xuất ở tốc độ khung hình thấp hơn theo mặc định và chỉ tăng lên tốc độ khung hình cao khi cần.
- Tốc độ làm mới màn hình tự động khớp với tốc độ kết xuất nội dung mà không bị giật.
Mặc dù hầu hết ứng dụng đều được hưởng lợi từ ARR mà không cần chỉnh sửa, nhưng bạn cũng có thể ghi đè hành vi tốc độ khung hình mặc định nếu cần.
Trang này mô tả những nội dung sau:
- Cách xác định tốc độ khung hình của mỗi Khung hiển thị.
- Chính sách chung về cách ARR xác định tốc độ khung hình được đặt.
- Cách bạn có thể ghi đè hành vi tốc độ khung hình mặc định theo cách thủ công.
Cơ chế bỏ phiếu trong Khung hiển thị
Trong hệ thống Khung hiển thị của Android, mỗi Khung hiển thị trong hệ phân cấp giao diện người dùng có thể thể hiện tốc độ khung hình ưu tiên. Các lựa chọn ưu tiên này được thu thập và kết hợp để xác định tốc độ khung hình cuối cùng cho mỗi khung hình. Điều này được thực hiện thông qua cơ chế bỏ phiếu, trong đó mỗi Khung hiển thị sẽ bỏ phiếu dựa trên thuộc tính tốc độ khung hình. Thuộc tính này có thể là một danh mục hoặc một tốc độ cụ thể. Khung hiển thị thường bỏ phiếu khi được vẽ hoặc cập nhật. Các lượt bỏ phiếu này được kết hợp để xác định tốc độ khung hình cuối cùng, sau đó được gửi đến lớp cấp thấp hơn dưới dạng gợi ý kết xuất.
Hiện tại, hầu hết Khung hiển thị đều mặc định ở tốc độ khung hình "Bình thường", thường được đặt thành 60 Hz. Đối với tốc độ khung hình cao hơn, bạn có thể sử dụng các API cụ thể để tuỳ chỉnh lựa chọn ưu tiên, trong đó hệ thống thường chọn tốc độ khung hình cao nhất. Để biết thêm thông tin về cách sử dụng các API này, hãy xem phần Đặt tốc độ khung hình hoặc danh mục. Các chính sách chung liên quan đến tốc độ khung hình được mô tả trong phần Chính sách chung về tốc độ khung hình.
Danh mục tốc độ khung hình
Trong lớp View
, có nhiều danh mục tốc độ khung hình có thể được sử dụng trong cuộc bỏ phiếu. Nội dung mô tả của từng danh mục như sau:
REQUESTED_FRAME_RATE_CATEGORY_DEFAULT
: Bạn có thể đặt giá trị này để quay lại hành vi mặc định, cho biết rằng Chế độ xem này không có dữ liệu về tốc độ khung hình.REQUESTED_FRAME_RATE_CATEGORY_NO_PREFERENCE
: Thành phần hiển thị sẽ không ảnh hưởng rõ ràng đến tốc độ khung hình. Điều này có nghĩa là ngay cả khi Chế độ xem đang hoạt động, khung này sẽ không xem xét chế độ xem đó khi xác định tốc độ khung hìnhREQUESTED_FRAME_RATE_CATEGORY_NORMAL
: Cho biết tốc độ khung hình trung bình phù hợp với ảnh động không yêu cầu tốc độ khung hình cao hơn hoặc không được hưởng lợi từ độ mượt cao. Tần số này thường là 60 Hz hoặc gần bằng.REQUESTED_FRAME_RATE_CATEGORY_HIGH
: Cho biết tốc độ khung hình phù hợp với các ảnh động yêu cầu tốc độ khung hình cao. Điều này có thể làm tăng độ mượt mà nhưng cũng có thể làm tăng mức sử dụng pin.
Thành phần hiển thị chỉ bỏ phiếu nếu cần vẽ lại. Tốc độ khung hình cuối cùng được xác định bằng số phiếu cao nhất. Ví dụ: nếu tất cả phiếu bầu đều chọn "Bình thường", thì "Bình thường" sẽ được chọn. Khi cả lượt bình chọn "Bình thường" và "Cao" đều xuất hiện, hệ thống sẽ chọn "Cao".
Tốc độ khung hình
Ngoài các danh mục tốc độ khung hình, Khung hiển thị cũng có thể chỉ định tốc độ khung hình ưu tiên, chẳng hạn như 30, 60 hoặc 120 Hz. Khi nhiều lượt bình chọn tốc độ khung hình được thực hiện, tốc độ khung hình cuối cùng sẽ được xác định theo các quy tắc sau:
- Bội số của nhau: Nếu tốc độ khung hình được bình chọn là bội số của nhau, thì giá trị cao nhất sẽ được chọn. Ví dụ: nếu có hai lượt bình chọn – 30 Hz và 90 Hz — thì 90 Hz sẽ được chọn làm tốc độ khung hình cuối cùng.
- Không phải bội số của nhau:
- Nếu có bất kỳ lượt bình chọn nào lớn hơn 60 Hz, thì lượt bình chọn đó sẽ được tính là "Cao".
- Nếu tất cả các phiếu bầu đều có tần suất 60 Hz trở xuống, thì đó được tính là phiếu bầu "Bình thường".
Ngoài ra, nếu có sự kết hợp của cả giá trị tốc độ khung hình và danh mục tốc độ khung hình, thì giá trị cao hơn thường xác định tốc độ kết xuất cuối cùng. Ví dụ: với kết hợp giữa lượt bỏ phiếu 60 Hz và lượt bỏ phiếu "Cao" hoặc lượt bỏ phiếu 120 Hz và lượt bỏ phiếu "Bình thường", tốc độ kết xuất thường được đặt thành 120 Hz.
Ngoài các lượt bình chọn từ một ứng dụng, cũng có thể có các gợi ý khác được gửi đến lớp cấp thấp hơn từ các thành phần khác nhau trong cùng một khung. Nhiều thành phần trong số này có thể bắt nguồn từ các thành phần trên Giao diện người dùng hệ thống, chẳng hạn như ngăn thông báo, thanh trạng thái, thanh điều hướng và các thành phần khác. Giá trị tốc độ khung hình cuối cùng được xác định dựa trên số lượt bình chọn của nhiều thành phần.
Đặt tốc độ khung hình hoặc danh mục
Trong một số trường hợp, bạn có thể có tốc độ khung hình ưu tiên cho một Khung hiển thị. Ví dụ: bạn có thể đặt tốc độ khung hình ưu tiên thành "Cao" cho một Chế độ xem để tăng tốc độ khung hình nếu ảnh động xuất hiện không mượt mà. Ngoài ra, nếu có ảnh động chậm hoặc tĩnh trên video (thường phát ở tốc độ 24 hoặc 30 Hz), bạn nên chạy ảnh động ở tốc độ thấp hơn "Bình thường" để giảm mức tiêu thụ điện năng.
Bạn có thể sử dụng API setRequestedFrameRate()
và getRequestedFrameRate()
để chỉ định tốc độ khung hình hoặc danh mục ưu tiên của một Chế độ xem nhất định.
Kotlin
// Set the preferred frame rate category to a View // set the frame rate category to NORMAL view.requestedFrameRate = View.REQUESTED_FRAME_RATE_CATEGORY_NORMAL // set the frame rate category to HIGH view.requestedFrameRate = View.REQUESTED_FRAME_RATE_CATEGORY_HIGH // reset the frame rate category view.requestedFrameRate = View.REQUESTED_FRAME_RATE_CATEGORY_DEFAULT // Set the preferred frame rate to a View // set the frame rate to 30 view.requestedFrameRate = 30f // set the frame rate to 60 view.requestedFrameRate = 60f // set the frame rate to 120 view.requestedFrameRate = 120f
Java
// Set the preferred frame rate category to a View // set the frame rate category to NORMAL view.setRequestedFrameRate(View.REQUESTED_FRAME_RATE_CATEGORY_NORMAL); // set the frame rate category to HIGH view.setRequestedFrameRate(View.REQUESTED_FRAME_RATE_CATEGORY_HIGH); // reset the frame rate category view.setRequestedFrameRate(View.REQUESTED_FRAME_RATE_CATEGORY_DEFAULT); // Set the preferred frame rate to a View // set the frame rate to 30 view.setRequestedFrameRate(30); // set the frame rate to 60 view.setRequestedFrameRate(60); // set the frame rate to 120 view.setRequestedFrameRate(120);
Để biết ví dụ về cách sử dụng, hãy xem TextureView
.
Chính sách chung về tỷ lệ giữ chân người dùng
Trong phần trước, chúng ta đã thảo luận rằng hầu hết ảnh động đều hiển thị ở tốc độ 60 Hz theo mặc định, vì mỗi Chế độ xem đều đặt "Bình thường" làm tốc độ khung hình ưu tiên. Tuy nhiên, có một số trường hợp ngoại lệ mà tốc độ khung hình được tăng lên "Cao" để đảm bảo ảnh động mượt mà hơn.
Sau đây là chính sách chung về tỷ lệ chi phí lưu trú:
- Tăng tốc độ chạm: Khi phát hiện một sự kiện chạm (
MotionEvent.ACTION_DOWN
), tốc độ làm mới sẽ được tăng lên "Cao" trong một khoảng thời gian sau khi thao tác chạm được nhả để duy trì khả năng phản hồi. - Cử chỉ hất: Cử chỉ hất được xử lý theo cách khác – tốc độ làm mới giảm dần khi vận tốc hất chậm lại. Bạn có thể tìm thấy thông tin chi tiết về hành vi này trong phần Cải thiện tính năng cuộn.
- Khởi chạy ứng dụng và chuyển đổi cửa sổ: Tốc độ làm mới cũng được tăng cường trong một khoảng thời gian trong quá trình khởi chạy ứng dụng, khởi chạy cửa sổ và chuyển đổi cửa sổ để đảm bảo trải nghiệm hình ảnh mượt mà.
- Ảnh động: Ảnh động liên quan đến chuyển động hoặc thay đổi kích thước sẽ tự động nhận được tốc độ làm mới cao hơn để tăng độ mượt mà khi vị trí hoặc kích thước của Khung hiển thị thay đổi.
SurfaceView
vàTextureView
: Tốc độ khung hình được đặt rõ ràng choTextureView
vàSurfaceView
sẽ được tuân thủ và áp dụng tương ứng.
Bật và tắt tính năng tăng cường cảm ứng
Bạn có thể bật và/hoặc tắt tính năng tăng cường cảm ứng ở cấp Window
. Theo mặc định, khi người dùng chạm và nhấc ngón tay khỏi màn hình, tốc độ kết xuất sẽ tăng lên trong một khoảng thời gian. API setFrameRateBoostOnTouchEnabled()
và getFrameRateBoostOnTouchEnabled()
cho phép bạn ngăn tốc độ kết xuất tăng lên khi chạm vào một Window
cụ thể.
Kotlin
// disable touch boost on a Window window.isFrameRateBoostOnTouchEnabled = false // enable touch boost on a Window window.isFrameRateBoostOnTouchEnabled = true // check if touch boost is enabled on a Window val isTouchBoostEnabled = window.isFrameRateBoostOnTouchEnabled
Java
// disable touch boost on a Window window.setFrameRateBoostOnTouchEnabled(false) // enable touch boost on a Window window.setFrameRateBoostOnTouchEnabled(true) // check if touch boost is enabled on a Window window.getFrameRateBoostOnTouchEnabled()
Cải thiện tính năng cuộn
Một trường hợp sử dụng chính để tối ưu hoá tốc độ khung hình một cách linh động là cải thiện trải nghiệm cuộn (hất). Nhiều ứng dụng phụ thuộc nhiều vào việc người dùng vuốt lên để xem nội dung mới. Tính năng nâng cao tính năng cuộn ARR sẽ tự động điều chỉnh tốc độ làm mới khi cử chỉ hất chậm lại, giảm dần tốc độ khung hình. Điều này giúp hiển thị hiệu quả hơn trong khi vẫn duy trì tính năng cuộn mượt mà.
Điểm cải tiến này áp dụng riêng cho các thành phần giao diện người dùng có thể cuộn, bao gồm cả ScrollView
, ListView
và GridView
, đồng thời có thể không áp dụng cho tất cả các phương thức triển khai tuỳ chỉnh.
Tính năng cuộn ARR có sẵn cho RecyclerView
và
NestedScrollView
. Để bật tính năng này trong ứng dụng, hãy nâng cấp lên phiên bản mới nhất của AndroidX.recyclerview
và AndroidX.core
. Hãy xem bảng sau đây để biết thông tin chi tiết.
Thư viện |
Phiên bản |
|
1.4.0 |
|
1.15.0 |
Đặt thông tin về vận tốc
Nếu bạn có một thành phần cuộn tuỳ chỉnh và muốn tận dụng tính năng cuộn, hãy gọi setFrameContentVelocity()
trên mọi khung hình trong khi cuộn hoặc hất nhẹ một cách mượt mà. Hãy xem đoạn mã sau đây để biết ví dụ:
Kotlin
// set the velocity to a View (1000 pixels/Second) view.frameContentVelocity = 1000f // get the velocity of a View val velocity = view.frameContentVelocity
Java
// set the velocity to a View view.setFrameContentVelocity(velocity); // get the velocity of a View final float velocity = view.getFrameContentVelocity()
Để biết thêm ví dụ, hãy xem RecyclerView
và
ScrollView
. Để đặt chính xác tốc độ, hãy tính toán tốc độ nội dung (pixel/giây) theo cách thủ công nếu không thể lấy thông tin bắt buộc từ Scroller
hoặc OverScroller
.
Xin lưu ý rằng nếu setFrameContentVelocity()
và getFrameContentVelocity()
được gọi trên các thành phần hiển thị không phải là thành phần cuộn được, thì các thành phần này sẽ không có hiệu lực nào, vì chuyển động sẽ tự động kích hoạt tốc độ khung hình tăng lên dựa trên chính sách hiện tại.
Thông tin về tốc độ là yếu tố quan trọng để điều chỉnh tốc độ kết xuất. Ví dụ: hãy xem xét cử chỉ hất. Ban đầu, tốc độ của một thao tác hất có thể rất cao, đòi hỏi tốc độ kết xuất cao hơn để đảm bảo độ mượt. Khi cử chỉ diễn ra, tốc độ sẽ giảm, cho phép giảm tốc độ kết xuất.
Bật và tắt ARR
ARR được bật theo mặc định để tăng hiệu suất pin. Mặc dù bạn có thể tắt tính năng này, nhưng bạn không nên làm như vậy vì ứng dụng sẽ tiêu thụ nhiều pin hơn. Chỉ cân nhắc tắt tính năng này nếu bạn gặp phải các vấn đề ảnh hưởng đáng kể đến trải nghiệm người dùng.
Để bật hoặc tắt ARR, hãy sử dụng API setFrameRatePowerSavingsBalanced()
trên Window
hoặc sử dụng API isFrameRatePowerSavingsBalanced()
thông qua tệp styles.xml
.
Đoạn mã sau đây cho biết cách bật hoặc tắt ARR trên Window
:
Kotlin
// disable ARR on a Window window.isFrameRatePowerSavingsBalanced = false // enable ARR on a Window window.isFrameRatePowerSavingsBalanced = true // check if ARR is enabled on a Window val isAdaptiveRefreshRateEnabled = window.isFrameRatePowerSavingsBalanced
Java
// disable ARR on a Window window.setFrameRatePowerSavingsBalanced(false) // enable ARR on a Window window.setFrameRatePowerSavingsBalanced(true) // check if ARR is enabled on a Window window.isFrameRatePowerSavingsBalanced()
Để tắt ARR thông qua tệp styles.xml
, hãy thêm mục sau vào kiểu của bạn trong res/values/styles.xml
:
<style name="frameRatePowerSavingsBalancedDisabled">
<item name="android:windowIsFrameRatePowerSavingsBalanced">false</item>
</style>