Saat mengembangkan atau mengoptimalkan game Android, sering kali akan sangat membantu untuk memahami pipeline grafis yang digunakan mesin Anda; mesin dapat memilih Vulkan atau GLES tanpa sinyal yang jelas dan dapat diakses developer. Sayangnya,
ada situasi saat mengandalkan logcat untuk memverifikasi apakah game berjalan di Vulkan atau telah beralih kembali ke OpenGL ES secara diam-diam dapat menjadi tidak andal.
Panduan ini menunjukkan cara menggunakan Android Performance Analyzer (APA) dan kueri SQL Perfetto kustom untuk mengidentifikasi API rendering aktif game secara pasti.
Batasan verifikasi berbasis log
- Log yang dihapus: Build produksi sering menyembunyikan inisialisasi dan jejak pemuatan driver.
- Positif palsu: Beberapa mesin game memuat library Vulkan dan OpenGL ES selama startup, mencetak log inisialisasi untuk keduanya, meskipun salah satunya akhirnya gagal dan memicu penggantian.
- Penggantian senyap: Jika inisialisasi Vulkan gagal karena masalah driver khusus perangkat, mesin game sering kali kembali ke OpenGL ES tanpa memunculkan error penting.
Mengukur menggunakan APA
Dengan menggunakan Android Performance Analyzer, Anda dapat merekam rekaman aktivitas sistem dan menganalisis data frame secara akurat melalui kueri SQL. Ikuti langkah-langkah berikut untuk mengukur penggunaan Vulkan dan GLES:
Merekam rekaman aktivitas dengan APA: Jalankan game Anda dan gunakan APA untuk merekam rekaman aktivitas sistem selama segmen yang ingin Anda analisis, seperti titik selama gameplay yang Anda duga mengalami penurunan frame. Setelah perangkat terhubung dan perekaman aktivitas selesai, data rekaman aktivitas akan dimuat di antarmuka APA.
Klik tab SQL di APA: Saat layar analisis rekaman aktivitas terbuka, di menu navigasi UI, klik tab SQL untuk membuka lingkungan pemroses rekaman aktivitas, tempat Anda dapat mengkueri data secara langsung.
Tempel kueri SQL berikut di tab APA SQL: Salin kueri SQL berikut dan tempel ke kolom input kueri. Kueri ini memindai rekaman aktivitas untuk peristiwa API gambar, seperti
eglSwapBuffers,QueuePresentKHR, danvkQueuePresentKHR. Bagian ini mengelompokkannya menurut nama proses dan menghitung jumlah API rendering serta distribusi persentase panggilan rendering Vulkan versus OpenGL ES:WITH raw_slices AS ( -- 1. Map each slice (API call) to its corresponding process or package via UTID and UPID SELECT p.name AS process_name, s.name AS slice_name FROM slice s JOIN thread_track tt ON s.track_id = tt.id JOIN thread t USING (utid) JOIN process p USING (upid) WHERE (s.name LIKE 'eglSwapBuffers%' OR s.name IN ('QueuePresentKHR', 'vkQueuePresentKHR')) -- Optional: To isolate your game, uncomment the following and filter by package name and thread name: -- AND p.name = 'com.example.mygame' -- AND t.name = 'RenderThread' ), process_stats AS ( -- 2. Aggregate counts per individual process SELECT process_name, SUM(CASE WHEN slice_name LIKE 'eglSwapBuffers%' THEN 1 ELSE 0 END) AS egl_count, SUM(CASE WHEN slice_name IN ('QueuePresentKHR', 'vkQueuePresentKHR') THEN 1 ELSE 0 END) AS vulkan_count FROM raw_slices GROUP BY process_name ), process_totals AS ( -- 3. Calculate total counts for denominator calculation SELECT process_name, egl_count, vulkan_count, (egl_count + vulkan_count) AS total_count FROM process_stats ) -- 4. Calculate final percentage shares per row, preventing division by zero errors SELECT process_name, egl_count, vulkan_count, total_count, ROUND(CAST(egl_count AS REAL) * 100 / NULLIF(total_count, 0), 2) AS "egl_percentage(%)", ROUND(CAST(vulkan_count AS REAL) * 100 / NULLIF(total_count, 0), 2) AS "vulkan_percentage(%)" FROM process_totals ORDER BY total_count DESC;Jalankan kueri: Klik tombol Run Query di dekat kolom input. Setelah kueri berjalan, tabel akan muncul di panel hasil yang menampilkan nama proses (
process_name), jumlah presentasi OpenGL ES (egl_count), jumlah presentasi Vulkan (vulkan_count), jumlah total presentasi (total_count), dan persentase setiap API yang digunakan (egl_percentage(%)danvulkan_percentage(%)).
Layar yang menampilkan kueri SQL yang dijalankan dan metrik API rendering yang dihasilkan ditampilkan dalam tabel
Kesalahan umum
Hindari kebingungan
SurfaceFlinger: Selalu cakup penelusuran Anda ke thread aplikasi game (RenderThread). Proses compositor di seluruh sistem sepertiSurfaceFlingermungkin menampilkan rekaman aktivitas Vulkan atau EGL yang merepresentasikan rendering UI sistem, bukan pipeline rendering internal game Anda. Untuk mengisolasi game Anda, hapus komentar pada filter opsional dalam klausaWHEREkueri SQL utama dan ganti'com.example.mygame'dengan nama paket game Anda:-- AND p.name = 'com.example.mygame' -- AND t.name = 'RenderThread'Periode pemanasan: Selalu rekam rekaman aktivitas setelah adegan 3D utama game dimuat sepenuhnya. Pengambilan gambar selama layar pembuka atau transisi pemuatan dapat menyebabkan inisialisasi yang menyesatkan.
Persyaratan Pelacakan Pengecualian LevelUp
Jika Anda menggunakan Android Performance Analyzer (APA) untuk merekam aktivitas guna memenuhi syarat untuk mendapatkan pengecualian LevelUp Google Play Game, ada persyaratan hardware tertentu agar rekaman aktivitas tersebut valid.
Sebaiknya Anda merekam aktivitas pelacakan menggunakan salah satu perangkat rujukan Level Up yang ditargetkan.
Selain itu, untuk memastikan validasi yang akurat, rekaman aktivitas tidak boleh diambil di perangkat yang menggunakan GPU ANGLE. Secara khusus, Anda tidak dapat menggunakan perangkat berikut untuk merekam aktivitas pengecualian LevelUp:
- Perangkat apa pun yang vendor GPU-nya adalah SLSI (Samsung), yang menggunakan GPU AMD Xclipse
- Pixel 11