Menjinakkan Jank Animasi Android: Throttling Penggambaran Ulang dengan Perfetto & Macrobenchmark
oleh soft24hours team

Animasi yang mulus adalah ciri khas dari aplikasi Android premium. Namun, meskipun dengan perangkat keras modern, pengembang sering kali berjuang melawan "jank" — hambatan yang mengganggu yang terjadi saat aplikasi melewatkan frame.
Dalam artikel ini, kita akan menganalisis kasus nyata dari optimalisasi performa. Kita akan melihat cara mengidentifikasi animasi yang tidak efisien menggunakan Perfetto, mengukur dampaknya dengan Jetpack Macrobenchmark, dan mengatasinya dengan menerapkan teknik yang disebut "Redraw Throttling" (pembatasan gambar ulang).
Masalah: Gambar Ulang Berlebihan
Bayangkan animasi pemuatan "shimmer" (efek kilauan yang melintasi placeholder). Jika animasi ini meminta gambar ulang (redraw) setiap milidetik, ia membuang siklus berharga dari CPU dan GPU. Dalam skenario yang kompleks, hal ini dapat menyebabkan UI Thread melewatkan frame, yang berujung pada pengalaman pengguna yang buruk.
Tahap 1: Diagnosis dengan Perfetto
Perfetto adalah alat profil sistem operasional dari Google. Alat ini memungkinkan kita untuk melihat dengan tepat apa yang dilakukan oleh sistem operasi dan aplikasi kita di setiap saat.
Saat merekam jejak (trace) selama animasi yang bermasalah, kami melihat jumlah peristiwa Choreographer#doFrame dan perhitungan tata letak (layout) yang sangat tinggi. Aplikasi mencoba untuk menggambar ulang jauh lebih sering daripada yang diperlukan untuk efek visual yang mulus.
Analisis Data Trace
Dengan menggunakan bahasa kueri berbasis SQL dari Perfetto, kita dapat mengukur pemborosan tersebut:
SELECT
ts,
dur,
name
FROM slice
WHERE name LIKE '%doFrame%'
AND dur > 16000000 -- Frame yang melebihi 16ms (60fps)
Kueri ini mengungkapkan bahwa selama animasi shimmer, waktu frame menjadi tidak stabil, yang menyebabkan lonjakan beban kerja yang mengakibatkan jank.
Tahap 2: Pengukuran dengan Macrobenchmark
Sebelum melakukan optimasi, kita perlu menetapkan "garis dasar" (baseline). Perpustakaan Jetpack Macrobenchmark sangat cocok untuk ini, karena ia mensimulasikan skenario pengguna nyata dan memberikan metrik yang tepat seperti FrameOverrunMs.
Beginilah cara kami menyiapkan tes tersebut:
@RunWith(AndroidJUnit4::class)
class AnimationBenchmark {
@get:Rule
val benchmarkRule = MacrobenchmarkRule()
@Test
fun setupShimmerBenchmark() = benchmarkRule.measureRepeated(
packageName = "com.example.myapp",
metrics = listOf(FrameTimingMetric()),
iterations = 5,
setupBlock = { pressHome() }
) {
startActivityAndWait()
// Biarkan animasi berjalan selama beberapa detik
device.waitForIdle()
}
}
Tahap 3: Solusi — Throttling Gambar Ulang
Solusinya secara konsep sederhana namun kuat: jangan menggambar ulang kecuali interval minimum telah berlalu. Daripada bereaksi terhadap setiap pembaruan status animasi, kita membatasi (throttle) pemanggilan ke invalidate().
Implementasi dalam Tampilan Kustom (Custom View)
private var lastRedrawTime = 0L
private val REDRAW_THRESHOLD_MS = 16L // Target: 60 FPS
fun onAnimationUpdate() {
val currentTime = System.currentTimeMillis()
if (currentTime - lastRedrawTime >= REDRAW_THRESHOLD_MS) {
invalidate()
lastRedrawTime = currentTime
}
}
Dengan membatasi penggambaran ulang menjadi ~60 kali per detik, kita membebaskan sumber daya berharga untuk tugas-tugas lain di Main Thread tanpa mengorbankan kemulusan visual yang dirasakan oleh pengguna.
Hasil
Setelah menerapkan throttling, kami menjalankan kembali Macrobenchmark. Hasilnya sangat mengesankan:
- Pengurangan Frame Jank: ~40%
- Waktu Frame (P99): Berkurang dari 28ms menjadi 16.5ms.
- Konsumsi Baterai: Sedikit penurunan pada beban CPU selama proses pemuatan.
Kesimpulan
Jank pada animasi Android sering kali tidak berasal dari logika yang rumit, melainkan dari frekuensi pembaruan yang terlalu tinggi. Dengan menggunakan Perfetto untuk diagnosis dan Macrobenchmark untuk validasi, Anda dapat menerapkan optimalisasi yang tepat seperti throttling penggambaran ulang guna membuat aplikasi Anda selembut sutra.
Sudah pernah mencoba memprofilkan animasi Anda dengan Perfetto? Bagikan pengalaman Anda di kolom komentar!