Vulkan ve OpenGL ES oyun oluşturma API'sini belirleme

Android oyunları geliştirirken veya optimize ederken motorunuzun hangi grafik ardışık düzenini kullandığını anlamak genellikle faydalı olabilir. Motorlar, geliştiricilerin kolayca erişebileceği sinyaller olmadan Vulkan veya GLES'i seçebilir. Maalesef bir oyunun Vulkan'da mı çalıştığını yoksa sessizce OpenGL ES'ye mi döndüğünü doğrulamak için logcat kullanmanın güvenilir olmadığı durumlar vardır.

Bu kılavuzda, bir oyunun etkin oluşturma API'sini kesin olarak belirlemek için Android Performance Analyzer (APA) ve özel Perfetto SQL sorgularının nasıl kullanılacağı açıklanmaktadır.

Günlüğe dayalı doğrulamanın sınırlamaları

  • Ayıklanmış günlükler: Üretim derlemeleri genellikle başlatma ve sürücü yükleme ayak izlerini gizler.
  • Yanlış pozitifler: Bazı oyun motorları, başlatma sırasında hem Vulkan hem de OpenGL ES kitaplıklarını yükler ve biri başarısız olup yedek tetiklese bile her ikisi için de başlatma günlüklerini yazdırır.
  • Sessiz yedekler: Vulkan başlatma işlemi, cihaza özel sürücü sorunları nedeniyle başarısız olursa motorlar genellikle kritik hatalar vermeden OpenGL ES'ye geri döner.

APA kullanarak ölçme

Android Performance Analyzer'ı kullanarak sistem izleme kaydedebilir ve SQL sorguları aracılığıyla kare verilerini hassas bir şekilde analiz edebilirsiniz. Vulkan ve GLES kullanımınızı ölçmek için aşağıdaki adımları uygulayın:

  1. APA ile izi yakalayın: Oyununuzu çalıştırın ve analiz etmek istediğiniz segmentte (ör. oyun sırasında kare düşüşlerinden şüphelendiğiniz bir noktada) sistem izini yakalamak için APA'yı kullanın. Cihaz bağlandıktan ve iz kaydı tamamlandıktan sonra iz verileri APA arayüzüne yüklenir.

  2. APA'da SQL sekmesini tıklayın: İz analizi ekranı açıkken kullanıcı arayüzünün gezinme menüsünde SQL sekmesini tıklayarak iz işleyici ortamını açın. Burada verileri doğrudan sorgulayabilirsiniz.

  3. Aşağıdaki SQL sorgusunu APA SQL sekmesine yapıştırın: Aşağıdaki SQL sorgusunu kopyalayıp sorgu giriş alanına yapıştırın. Bu sorgu, izi tarayarak eglSwapBuffers, QueuePresentKHR ve vkQueuePresentKHR gibi çizim API'si etkinliklerini bulur. Bunları işlem adına göre gruplandırır ve oluşturma API'si sayılarını ve Vulkan ile OpenGL ES oluşturma çağrılarının yüzde dağılımını hesaplar:

    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. Sorguyu çalıştırma: Giriş alanının yanındaki Run Query (Sorguyu Çalıştır) düğmesini tıklayın. Sorgu çalıştırıldıktan sonra sonuçlar bölmesinde işlem adını (process_name), OpenGL ES sunum sayısını (egl_count), Vulkan sunum sayısını (vulkan_count), toplam sunum sayısını (total_count) ve kullanılan her API'nin yüzdesini (egl_percentage(%) ve vulkan_percentage(%)) gösteren bir tablo görünür.

    Yürütülen SQL sorgusunu ve sonuçta elde edilen oluşturma API'si metriklerini bir tabloda gösteren ekran

Sık karşılaşılan sorunlar

  • SurfaceFlinger karışıklığını önleyin: Aramanızın kapsamını her zaman oyununuzun uygulama iş parçacığı (RenderThread) olarak belirleyin. SurfaceFlinger gibi sistem genelindeki birleştirici işlemler, oyununuzun dahili oluşturma ardışık düzenini değil, sistem kullanıcı arayüzü oluşturmayı temsil eden Vulkan veya EGL parçalarını gösterebilir. Oyununuzu izole etmek için ana SQL sorgusunun WHERE yan tümcesindeki isteğe bağlı filtrelerin açıklama satırı işaretini kaldırın ve 'com.example.mygame' yerine oyununuzun paket adını yazın:

    -- AND p.name = 'com.example.mygame'
    -- AND t.name = 'RenderThread'
    
  • Isınma süresi: İzlemeyi her zaman oyunun ana 3D sahnesi tamamen yüklendikten sonra kaydedin. Başlangıç ekranları veya yükleme geçişleri sırasında yakalama işlemi, yanıltıcı başlatmalara neden olabilir.

LevelUp Muafiyet İzleme Şartları

Google Play Games LevelUp muafiyetine hak kazanmak amacıyla iz yakalamak için Android Performance Analyzer'ı (APA) kullanıyorsanız izin geçerli olması için belirli donanım gereksinimleri vardır.

İzinizi, hedeflenen Level Up referans cihazlarından birini kullanarak yakalamanız önemle tavsiye edilir.

Ayrıca, doğru doğrulama için izlemeniz ANGLE GPU kullanan bir cihazda alınmamalıdır. Özellikle, LevelUp muafiyeti izinizi yakalamak için aşağıdaki cihazları kullanamazsınız:

  • GPU tedarikçisinin SLSI (Samsung) olduğu ve AMD Xclipse GPU'ların kullanıldığı tüm cihazlar
  • Pixel 11