Mengidentifikasi API rendering game Vulkan versus OpenGL ES

Saat mengembangkan atau mengoptimalkan game Android, sering kali akan membantu jika Anda memahami pipeline grafis yang digunakan engine Anda; engine dapat memilih Vulkan atau GLES tanpa sinyal yang dapat diakses developer dengan jelas. Sayangnya, ada situasi saat mengandalkan logcat untuk memverifikasi apakah game berjalan di Vulkan atau telah otomatis beralih ke OpenGL ES dapat menjadi tidak dapat diandalkan.

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 kali menyembunyikan jejak inisialisasi dan pemuatan driver.
  • Positif palsu: Beberapa game engine memuat library Vulkan dan OpenGL ES selama startup, mencetak log inisialisasi untuk keduanya, meskipun salah satunya akhirnya gagal dan memicu penggantian.
  • Penggantian otomatis: Jika inisialisasi Vulkan gagal karena masalah driver khusus perangkat, engine sering kali beralih ke OpenGL ES tanpa menampilkan error kritis.

Mengukur menggunakan APA

Dengan menggunakan Android Performance Analyzer, Anda dapat merekam pelacakan sistem dan menganalisis data frame secara akurat melalui kueri SQL. Ikuti langkah-langkah berikut untuk mengukur penggunaan Vulkan dan GLES:

  1. Merekam pelacakan sistem dengan APA: Jalankan game Anda dan gunakan APA untuk merekam pelacakan sistem selama segmen yang ingin Anda analisis, seperti titik selama gameplay saat Anda mencurigai adanya penurunan frame. Setelah perangkat terhubung dan perekaman pelacakan selesai, data rekaman pelacakan akan dimuat di antarmuka APA.

  2. 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.

  3. Tempel kueri SQL berikut di tab APA SQL: Salin kueri SQL berikut dan tempelkan ke kolom input kueri. Kueri ini memindai trace untuk peristiwa API gambar, seperti eglSwapBuffers, QueuePresentKHR, dan vkQueuePresentKHR. Skrip ini mengelompokkannya berdasarkan nama proses dan menghitung jumlah API rendering dan 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;
    
  4. 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(%) dan vulkan_percentage(%)).

    Layar yang menampilkan kueri SQL yang dieksekusi dan metrik rendering API yang dihasilkan ditampilkan dalam tabel

Kesalahan umum

  • Hindari kebingungan SurfaceFlinger: Selalu cakup penelusuran Anda ke thread aplikasi game (RenderThread). Proses compositor di seluruh sistem seperti SurfaceFlinger mungkin menampilkan trek Vulkan atau EGL yang mewakili rendering UI sistem, bukan pipeline rendering internal game Anda. Untuk mengisolasi game Anda, hapus tanda komentar pada filter opsional dalam klausa WHERE kueri 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 scene 3D utama game dimuat sepenuhnya. Pengambilan selama layar pembuka atau transisi pemuatan dapat menyebabkan inisialisasi yang menyesatkan.

Persyaratan Pelacakan Pengecualian LevelUp

Jika Anda menggunakan Android Performance Analyzer (APA) untuk merekam trace agar memenuhi syarat untuk pengecualian Google Play Game LevelUp, ada persyaratan hardware khusus agar trace valid.

Sangat disarankan agar Anda merekam rekaman aktivitas menggunakan salah satu perangkat referensi Level Up yang ditargetkan.

Selain itu, untuk memastikan validasi yang akurat, rekaman aktivitas Anda tidak boleh diambil di perangkat yang menggunakan GPU ANGLE. Secara khusus, Anda tidak dapat menggunakan perangkat berikut untuk merekam trace pengecualian LevelUp:

  • Semua perangkat dengan vendor GPU SLSI (Samsung), yang menggunakan GPU AMD Xclipse
  • Pixel 11