Dùng Khung hiệu suất động Android (Android Dynamic Performance Framework) để tối ưu hoá hiệu suất CPU và nhiệt độ

Hướng dẫn này mô tả cách sử dụng Khung hiệu suất động Android (ADPF) để tối ưu hoá trò chơi dựa trên các tính năng động giúp quản lý nhiệt, CPU và GPU trên Android. Dù trọng tâm là trò chơi, nhưng bạn cũng có thể sử dụng các tính năng này cho các ứng dụng khác nặng về hiệu suất.

ADPF là một tập hợp API cho phép các trò chơi và ứng dụng cần nhiều hiệu suất tương tác trực tiếp hơn với hệ thống nguồn điện và nhiệt của thiết bị Android. Với những API này, bạn có thể theo dõi hành vi động trên hệ thống Android và tối ưu hoá hiệu suất trò chơi ở mức ổn định mà không gây quá nhiệt cho thiết bị.

Hệ thống SoC của thiết bị di động và Android có nhiều hành vi hiệu suất động hơn so với máy tính và máy chơi trò chơi. Những hành vi này bao gồm cả quy trình quản lý trạng thái nhiệt, các loại tốc độ xung nhịp của CPU và GPU cũng như nhiều loại nhân CPU đa dạng. Điều này, cùng với sự phát triển ngày càng đa dạng của cấu trúc liên kết nhân xử lý trên các hệ thống SoC, tạo ra nhiều thách thức trong việc cố gắng đảm bảo rằng trò chơi có thể tận dụng loại hành vi này mà không gây ảnh hưởng tiêu cực đến hiệu suất của thiết bị. ADPF cung cấp một số thông tin như vậy để giúp việc dự đoán hiệu suất trở nên dễ dàng hơn.

Sau đây là các tính năng chính của ADPF:

  • Theo dõi trạng thái nhiệt: Theo dõi trạng thái nhiệt của thiết bị, sau đó chủ động điều chỉnh hiệu suất trước khi thiết bị trở nên không ổn định.

  • Gợi ý về hiệu suất của CPU: Đưa ra gợi ý về hiệu suất cho phép Android chọn xung nhịp CPU và nhân xử lý phù hợp thay vì chọn dựa trên mức tải trước đó.

  • Chế độ hiệu suất cố định: Bật chế độ hiệu suất cố định trên một thiết bị trong quá trình đo điểm chuẩn để nhận các số liệu đo lường không bị thay đổi bởi tính năng xung nhịp CPU động.

Giám sát trạng thái nhiệt

Đã phát hành: Android 11 (API cấp độ 30)
Yêu cầu đối với tất cả thiết bị: Android 13 (API cấp độ 33) trở lên

Hiệu suất tiềm năng của ứng dụng bị giới hạn bởi trạng thái nhiệt của thiết bị. Trạng thái nhiệt có thể thay đổi tuỳ theo các yếu tố đặc thù như thời tiết, mức sử dụng gần đây và thiết kế tản nhiệt của thiết bị. Các thiết bị chỉ có thể duy trì hiệu suất cao trong một khoảng thời gian giới hạn trước khi bị điều tiết nhiệt. Mục tiêu chính của việc triển khai là đạt được mục tiêu về hiệu suất mà không bị vượt quá giới hạn nhiệt. Ngoài ra, khi gỡ lỗi các vấn đề về hiệu suất, điều quan trọng là biết được thời điểm hiệu suất bị giới hạn bởi trạng thái nhiệt của thiết bị.

Các công cụ phát triển trò chơi thường có các thông số hiệu suất trong thời gian chạy giúp điều chỉnh mức tải mà công cụ phân cho thiết bị. Ví dụ: các thông số này có thể thiết lập số lượng luồng công việc, chỉ định luồng công việc cho các nhân xử lý lớn và nhỏ, các tuỳ chọn về độ trung thực của GPU cũng như độ phân giải bộ đệm khung.

Khi thiết bị đạt đến trạng thái nhiệt không an toàn, trò chơi có thể tránh bị điều tiết bằng cách giảm mức tải thông qua các thông số này. Để tránh việc bị điều tiết, bạn nên theo dõi trạng thái nhiệt của thiết bị và chủ động điều chỉnh mức tải của công cụ phát triển trò chơi. Khi thiết bị quá nóng, mức tải phải giảm xuống dưới mức hiệu suất ổn định để phân tán nhiệt.

PowerManager

ADPF cung cấp lớp PowerManager để theo dõi trạng thái nhiệt của thiết bị. Sau đây là các phần tử chính:

Bạn có thể theo dõi trạng thái nhiệt của thiết bị bằng cách thăm dò phương thức getThermalHeadroom. Phương thức này xác định khoảng thời gian thiết bị có thể duy trì mức hiệu suất hiện tại mà không quá nhiệt. Nếu khoảng thời gian này ít hơn thời gian cần thiết để chạy mức tải, thì trò chơi sẽ giảm mức tải xuống một mức ổn định. Ví dụ: trò chơi có thể chuyển sang các nhân xử lý nhỏ hơn, giảm tốc độ khung hình hoặc giảm độ trung thực.

Gợi ý về hiệu suất của CPU

Đã phát hành: Android 12 (API cấp 31)
Yêu cầu trên tất cả thiết bị: Chưa có yêu cầu

Với các gợi ý về hiệu suất của CPU, trò chơi có thể can thiệp vào hành vi hiệu suất CPU động mà không làm quá nhiệt thiết bị và lãng phí nguồn điện. Trên hầu hết thiết bị, Android tự động điều chỉnh tốc độ xung nhịp của CPU và loại nhân cho mức tải dựa trên nhu cầu trước đó. Nếu mức tải sử dụng nhiều tài nguyên CPU hơn, tốc độ xung nhịp sẽ tăng lên; và cuối cùng thì mức tải đó sẽ được chuyển sang nhân xử lý lớn hơn. Nếu mức tải sử dụng ít tài nguyên hơn, thì Android sẽ giảm mức phân bổ tài nguyên.

Tốc độ xung nhịp

Khi thiết bị Android tự động điều chỉnh tốc độ xung nhịp CPU, tần số CPU có thể thay đổi mức độ ảnh hưởng của mã đối với hiệu suất. Việc thiết kế mã nhằm giải quyết tốc độ xung nhịp là yếu tố quan trọng để tối đa hoá hiệu suất, duy trì trạng thái nhiệt an toàn và sử dụng điện năng hiệu quả. Bạn có thể tạm thời giảm hiện tượng giật và tăng khả năng phản hồi bằng cách chạy trò chơi ở tốc độ xung nhịp cao nhất, tuy nhiên việc này làm tiêu hao điện năng và cuối cùng dẫn đến tình trạng điều tiết nhiệt ở mức xung nhịp này. Khi xung nhịp bị điều tiết, CPU hoặc GPU sẽ hoạt động dưới mức ổn định.

Bạn không thể trực tiếp chỉ định tần số của CPU trong mã của ứng dụng. Do đó, các ứng dụng thường cố gắng chạy ở tốc độ xung nhịp CPU cao thay vì chạy một vòng lặp liên tục trong một luồng ở chế độ nền, vì vậy mức tải có vẻ như đòi hỏi nhiều hơn. Điều này làm lãng phí điện năng và tăng lượng nhiệt sinh ra trên thiết bị trong khi ứng dụng không sử dụng tài nguyên bổ sung.

Các loại nhân

Một yếu tố hiệu suất quan trọng khác là: loại nhân CPU mà trò chơi chạy trên đó. Các thiết bị Android thường thay đổi nhân CPU được chỉ định cho một luồng động dựa trên hành vi của mức tải gần đây. Việc chỉ định nhân CPU thậm chí còn phức tạp hơn trên các hệ thống SoC có nhiều loại nhân. Trên một số thiết bị, bạn chỉ có thể sử dụng các nhân xử lý lớn hơn trong thời gian ngắn trước khi thiết bị rơi vào trạng thái không ổn định về nhiệt.

Trò chơi của bạn không nên tìm cách chỉ định luồng công việc (CPU core affinity) cho các nhân CPU vì những lý do sau:

  • Loại nhân phù hợp nhất cho một mức tải cụ thể còn tuỳ theo kiểu thiết bị.

  • Độ ổn định khi chạy trên các nhân lớn hơn còn tuỳ theo hệ thống SoC và các giải pháp nhiệt do từng mẫu thiết bị cung cấp.

  • Tác động của yếu tố môi trường đối với trạng thái nhiệt có thể khiến việc chọn nhân trở nên phức tạp hơn. Ví dụ: thời tiết hoặc ốp lưng điện thoại có thể thay đổi trạng thái nhiệt của thiết bị.

  • Việc chọn nhân xử lý không thể đáp ứng các thiết bị mới với hiệu suất và năng lực xử lý nhiệt cao hơn. Do đó, các thiết bị thường bỏ qua việc chỉ định luồng công việc cho các nhân xử lý của trò chơi.

PeformanceHintManager

ADPF cung cấp lớp PerformanceHintManager để các trò chơi có thể đưa ra gợi ý hiệu suất cho Android về tốc độ xung nhịp và loại nhân CPU. Sau đó, hệ điều hành có thể quyết định cách sử dụng các gợi ý đó một cách tối ưu dựa trên hệ thống SoC và giải pháp tản nhiệt của thiết bị. Nếu kết hợp API này với tính năng theo dõi trạng thái nhiệt, ứng dụng có thể đưa ra các gợi ý phù hợp hơn cho hệ điều hành thay vì sử dụng các vòng lặp liên tục cũng như kỹ thuật lập trình khác có thể gây ra tình trạng điều tiết.

Sau đây là cách trò chơi sử dụng gợi ý về hiệu suất:

  1. Tạo phiên gợi ý cho các luồng chính hoạt động tương tự. Ví dụ:

    • Luồng kết xuất hình ảnh nhận một phiên
    • Luồng IO nhận một phiên khác
    • Luồng âm thanh nhận phiên thứ ba

    Trò chơi nên thực hiện việc này sớm, ít nhất 2 mili giây và tốt nhất là trên 4 mili giây trước khi phiên hoạt động cần tăng tài nguyên hệ thống.

  2. Trong mỗi phiên gợi ý, hãy dự đoán thời lượng cần thiết mà mỗi phiên sẽ chạy. Thường thì thời lượng này tương đương với khoảng thời gian của một khung hình, nhưng ứng dụng có thể sử dụng khoảng thời gian ngắn hơn nếu mức tải không thay đổi đáng kể giữa các khung hình.

Chế độ hiệu suất cố định

Đã phát hành: Android 11 (API cấp 30)
Yêu cầu trên tất cả thiết bị: Chưa có yêu cầu

Các thiết bị Android có thể thay đổi tốc độ xung nhịp theo tải của hệ thống. Hành vi này giúp tiết kiệm điện năng trong quá trình sử dụng, nhưng có thể gây khó khăn cho việc nhận dữ liệu hiệu suất đáng tin cậy. Nếu bạn đang cố gắng xác định tốc độ của một phân đoạn mã để ngăn chặn sự hồi quy hoặc nếu một hoạt động tối ưu hoá có thể lặp lại, thì kết quả sẽ không đáng tin cậy khi không được kiểm tra ở tốc độ xung nhịp cố định. Với xung nhịp cố định, bạn có thể tiến hành thử nghiệm A/B chính xác về hiệu suất mà không cần thay đổi tần số CPU.

Chế độ hiệu suất cố định thiết lập giới hạn trên và giới hạn dưới cho xung nhịp CPU và GPU. Chế độ này không tắt các hành vi hiệu suất động khác, chẳng hạn như lựa chọn nhân xử lý.

Bạn có thể bật chế độ hiệu suất cố định bằng lệnh adb sau đây:

adb shell cmd power set-fixed-performance-mode-enabled [true|false]

Một thiết bị đang chạy ở chế độ hiệu suất cố định vẫn có thể bị quá nhiệt vì chế độ này không giúp duy trì thiết bị đó ở trạng thái ổn định nhiệt. Do đó, bạn nên thực hiện những việc sau đây để chạy phép đo điểm chuẩn:

  • Chờ cho thiết bị trở về trạng thái nhiệt ổn định trước khi bắt đầu chạy.

  • Theo dõi trạng thái nhiệt của thiết bị trong quá trình thử nghiệm để xác định sự khác biệt về tác động giữa mã đo điểm chuẩn và các sự kiện nhiệt.

Ứng dụng mẫu

Ứng dụng mẫu ADPF minh hoạ cách sử dụng cơ bản của ADPF API. Mẫu này cho thấy trạng thái nhiệt của thiết bị bằng cách sử dụng API getThermalHeadroom của ADPF và API trạng thái nhiệt. Ứng dụng cũng thay đổi mức tải một cách linh động dựa trên gợi ý của API cũng như sử dụng API PerformanceHintManager để kiểm soát hiệu suất của luồng kết xuất hình ảnh.