Mengoptimalkan performa termal dan CPU dengan Android Dynamic Performance Framework

Panduan ini menjelaskan cara menggunakan Android Dynamic Performance Framework (ADPF) untuk mengoptimalkan game berdasarkan fitur pengelolaan termal, CPU, dan GPU yang dinamis di Android. Fokusnya adalah pada game, tetapi Anda juga dapat menggunakan fitur untuk aplikasi lainnya yang membutuhkan performa tinggi.

ADPF adalah sekumpulan API yang memungkinkan game dan aplikasi yang membutuhkan performa tinggi untuk berinteraksi lebih langsung dengan sistem daya dan termal perangkat Android. Dengan API ini, Anda dapat memantau perilaku dinamis di sistem Android dan mengoptimalkan performa game pada level berkelanjutan yang tidak membuat perangkat terlalu panas.

SoC seluler dan Android memiliki perilaku performa yang lebih dinamis daripada desktop dan konsol. Perilaku ini mencakup pengelolaan status termal, berbagai clock CPU dan GPU, serta berbagai jenis core CPU. Ini dikombinasikan dengan topologi core SoC yang semakin beragam akan menciptakan tantangan saat mencoba memastikan bahwa game Anda dapat memanfaatkan perilaku ini tanpa berpengaruh negatif pada performa perangkat. ADPF menyediakan beberapa informasi ini untuk membuat performa lebih dapat diprediksi.

Berikut adalah fitur utama ADPF:

  • Pemantauan status termal: Memantau status termal perangkat, lalu secara proaktif menyesuaikan performa sebelum menjadi tidak berkelanjutan.

  • Petunjuk performa CPU: Memberikan petunjuk performa yang memungkinkan Android memilih clock CPU dan jenis core yang tepat, bukan Android yang memilih berdasarkan beban kerja sebelumnya.

  • Mode performa tetap: Mengaktifkan mode performa tetap pada perangkat selama benchmarking untuk mendapatkan pengukuran yang tidak diubah oleh clock CPU dinamis.

Pemantauan status termal

Dirilis: Android 11 (API level 30)
Wajib di semua perangkat: Android 13 (API level 33) atau yang lebih baru

Potensi performa aplikasi Anda dibatasi oleh status termal perangkat, yang dapat bervariasi berdasarkan karakteristik seperti cuaca, penggunaan terbaru, dan desain termal perangkat. Perangkat hanya dapat mempertahankan level performa yang tinggi selama jangka waktu tertentu sebelum di-throttle secara termal. Sasaran utama penerapan Anda adalah untuk mencapai sasaran performa tanpa melampaui batasan termal. Selain itu, saat melakukan debug masalah performa, penting untuk mengetahui kapan status termal perangkat membatasi performa.

Game engine biasanya memiliki parameter performa runtime yang dapat menyesuaikan beban kerja yang diberikan mesin di perangkat. Misalnya, parameter ini dapat menetapkan jumlah thread pekerja, afinitas thread pekerja untuk core besar dan kecil, opsi fidelitas GPU, dan resolusi framebuffer.

Saat perangkat mendekati status termal yang tidak aman, game Anda dapat menghindari throttling dengan mengurangi beban kerja melalui parameter ini. Untuk menghindari throttling, Anda harus memantau status termal perangkat dan secara proaktif menyesuaikan beban kerja game engine. Setelah perangkat menjadi terlalu panas, beban kerja harus berkurang di bawah level performa berkelanjutan untuk menghilangkan panas.

PowerManager

ADPF menyediakan class PowerManager untuk memantau status termal perangkat. Berikut adalah elemen utamanya:

Anda dapat memantau status termal perangkat dengan memilih metode getThermalHeadroom. Metode ini menentukan berapa lama perangkat dapat mempertahankan level performa saat ini tanpa panas berlebih. Jika waktunya kurang dari jumlah yang diperlukan untuk menjalankan beban kerja, game Anda harus mengurangi beban kerja ke level yang berkelanjutan. Misalnya, game dapat beralih ke core yang lebih kecil, mengurangi kecepatan frame, atau menurunkan fidelitas.

Petunjuk performa CPU

Dirilis: Android 12 (API level 31)
Wajib di semua perangkat: Belum wajib

Dengan petunjuk performa CPU, game dapat memengaruhi perilaku performa CPU dinamis tanpa membuat perangkat terlalu panas dan menghabiskan daya. Pada sebagian besar perangkat, Android secara dinamis menyesuaikan kecepatan clock dan jenis core CPU untuk beban kerja berdasarkan permintaan sebelumnya. Jika beban kerja menggunakan lebih banyak resource CPU, kecepatan clock akan ditingkatkan dan beban kerja pada akhirnya akan dipindahkan ke core yang lebih besar. Jika beban kerja menggunakan lebih sedikit resource, Android akan menurunkan alokasi resource.

Kecepatan clock

Saat perangkat Android menyesuaikan kecepatan clock CPU secara dinamis, frekuensi tersebut dapat mengubah dampak performa kode Anda. Mendesain kode yang menangani kecepatan clock dinamis penting untuk memaksimalkan performa, mempertahankan status termal yang aman, dan menggunakan daya secara efisien. Anda dapat mengurangi jank dan meningkatkan responsivitas untuk sementara dengan menjalankan game pada kecepatan clock puncak, tetapi hal ini akan menguras daya dan pada akhirnya menyebabkan clock di-throttle karena panas. Saat clock CPU atau GPU di-throttle, performanya berada di bawah level yang berkelanjutan.

Anda tidak dapat langsung menetapkan frekuensi CPU dalam kode aplikasi. Akibatnya, cara umum bagi aplikasi untuk mencoba berjalan pada kecepatan clock CPU yang lebih tinggi adalah dengan menjalankan loop sibuk di thread latar belakang sehingga beban kerja tampaknya lebih menuntut. Hal ini menguras daya dan meningkatkan beban termal pada perangkat saat aplikasi tidak menggunakan resource tambahan.

Jenis core

Jenis core CPU yang digunakan untuk menjalankan game Anda adalah faktor performa yang penting. Perangkat Android sering mengubah core CPU yang ditetapkan ke thread secara dinamis berdasarkan perilaku beban kerja terbaru. Penetapan core CPU bahkan lebih kompleks pada SoC dengan beberapa jenis core. Pada beberapa perangkat ini, core yang lebih besar hanya dapat digunakan sebentar tanpa beralih ke kondisi yang tidak berkelanjutan secara termal.

Game Anda tidak boleh mencoba menetapkan afinitas core CPU karena alasan berikut:

  • Jenis core terbaik untuk beban kerja bervariasi menurut model perangkat.

  • Keberlanjutan menjalankan core yang lebih besar bervariasi menurut SoC dan berbagai solusi termal yang disediakan oleh setiap model perangkat.

  • Dampak lingkungan pada status termal dapat semakin mempersulit pilihan core. Misalnya, cuaca atau casing ponsel dapat mengubah status termal perangkat.

  • Pemilihan core tidak dapat mengakomodasi perangkat baru dengan performa tambahan dan kemampuan termal. Akibatnya, perangkat sering kali mengabaikan afinitas prosesor game.

PeformanceHintManager

ADPF menyediakan class PerformanceHintManager sehingga game dapat membuat petunjuk performa ke Android untuk kecepatan clock CPU dan jenis core. OS kemudian dapat memutuskan cara terbaik untuk menggunakan petunjuk berdasarkan SoC dan solusi termal perangkat. Jika aplikasi Anda menggunakan API ini beserta pemantauan status termal, aplikasi dapat memberikan petunjuk yang lebih tepat ke OS, bukan menggunakan loop sibuk dan teknik coding lainnya yang dapat menyebabkan throttling.

Berikut ini cara game menggunakan petunjuk performa:

  1. Buat sesi petunjuk untuk thread utama yang berperilaku serupa. Contoh:

    • Thread rendering mendapatkan satu sesi
    • Thread IO mendapatkan sesi satunya
    • Thread audio mendapatkan sesi ketiga

    Game harus melakukannya lebih awal, setidaknya 2 md, dan sebaiknya lebih dari 4 md sebelum sebuah sesi memerlukan peningkatan resource sistem.

  2. Di setiap sesi petunjuk, prediksikan durasi yang diperlukan untuk menjalankan setiap sesi. Durasi biasanya setara dengan interval frame, tetapi aplikasi dapat menggunakan interval yang lebih pendek jika beban kerja tidak bervariasi secara signifikan di seluruh frame.

Mode performa tetap

Dirilis: Android 11 (API level 30)
Wajib di semua perangkat: Belum wajib

Perangkat Android dapat mengubah pengaturan clock secara dinamis berdasarkan beban sistem. Perilaku ini bagus untuk menghemat daya selama penggunaan, tetapi dapat menyulitkan saat ingin mendapatkan data performa yang andal. Jika Anda mencoba menentukan seberapa cepat fragmen kode dapat berjalan untuk mencegah regresi, atau jika pengoptimalan dapat diulang, hasil Anda tidak akan dapat diandalkan jika tidak diuji pada kecepatan clock tetap. Dengan clock tetap, Anda dapat melakukan pengujian A/B yang akurat terhadap performa tanpa mengubah frekuensi CPU yang menjadi faktornya.

Mode performa tetap menyetel clock CPU dan GPU dengan batas atas dan bawah. Mode ini tidak menonaktifkan perilaku performa dinamis lainnya, seperti pemilihan core.

Anda dapat mengaktifkan mode performa tetap dengan perintah adb berikut:

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

Perangkat yang berjalan dalam mode performa masih bisa mengalami panas berlebih karena mode tersebut tidak mengubah status perangkat menjadi berkelanjutan secara termal. Oleh karenanya, kami merekomendasikan hal berikut untuk menjalankan benchmark:

  • Tunggu perangkat kembali ke kondisi termal yang berkelanjutan sebelum memulai operasi.

  • Pantau status termal perangkat selama pengujian untuk membedakan dampak antara kode benchmark dan peristiwa termal.

Aplikasi contoh

Aplikasi contoh ADPF menunjukkan penggunaan dasar ADPF API. Contoh ini menampilkan status termal perangkat menggunakan getThermalHeadroom API dan thermal status API dari ADPF. Aplikasi juga secara dinamis mengubah beban kerja berdasarkan petunjuk API dan PerformanceHintManager API untuk mengontrol performa thread render.