判斷遊戲算繪 API 是 Vulkan 還是 OpenGL ES

開發或最佳化 Android 遊戲時,瞭解引擎使用的繪圖管道通常很有幫助;引擎可能會選擇 Vulkan 或 GLES,但不會提供開發人員可存取的明確信號。很遺憾,在某些情況下,依賴 logcat 驗證遊戲是否在 Vulkan 上執行,或是否已無聲無息地改用 OpenGL ES,可能不可靠。

本指南說明如何使用 Android Performance Analyzer (APA) 和自訂 Perfetto SQL 查詢,明確找出遊戲的有效算繪 API。

記錄檔型驗證的限制

  • 經過處理的記錄:生產版本通常會隱藏初始化和驅動程式載入的足跡。
  • 誤判:部分遊戲引擎會在啟動時載入 Vulkan 和 OpenGL ES 程式庫,並列印兩者的初始化記錄,即使其中一個最終失敗並觸發備援機制也一樣。
  • 無聲回溯:如果 Vulkan 初始化作業因裝置專屬的驅動程式問題而失敗,引擎通常會回溯至 OpenGL ES,不會擲回重大錯誤。

使用 APA 評估

使用 Android Performance Analyzer,您可以記錄系統追蹤記錄,並透過 SQL 查詢精確分析影格資料。請按照下列步驟測量 Vulkan 和 GLES 的使用情況:

  1. 使用 APA 擷取追蹤記錄:執行遊戲並使用 APA,在您要分析的區段 (例如遊戲期間懷疑有掉格問題的點) 擷取系統追蹤記錄。裝置連線並完成追蹤記錄後,追蹤資料就會載入 APA 介面。

  2. 在 APA 中按一下「SQL」分頁:開啟追蹤記錄分析畫面後,在 UI 的導覽選單中,按一下「SQL」分頁,開啟追蹤記錄處理器環境,直接查詢資料。

  3. 在 APA SQL 分頁中貼上下列 SQL 查詢:複製下列 SQL 查詢,並貼到查詢輸入欄位。這項查詢會掃描追蹤記錄,找出繪圖 API 事件,例如 eglSwapBuffersQueuePresentKHRvkQueuePresentKHR。並依程序名稱分組,計算 Vulkan 與 OpenGL ES 算繪呼叫的算繪 API 數量和百分比分布:

    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. 執行查詢:按一下輸入欄位附近的「執行查詢」按鈕。 查詢執行完畢後,結果窗格會顯示表格,其中包含程序名稱 (process_name)、OpenGL ES 呈現次數 (egl_count)、Vulkan 呈現次數 (vulkan_count)、呈現總次數 (total_count),以及各 API 的使用百分比 (egl_percentage(%)vulkan_percentage(%))。

    畫面:顯示已執行的 SQL 查詢,以及以表格形式呈現的結果算繪 API 指標

常見陷阱

  • 避免 SurfaceFlinger 混淆:請務必將搜尋範圍限定在遊戲的應用程式執行緒 (RenderThread)。SurfaceFlinger 等系統層級的合成器程序可能會顯示 Vulkan 或 EGL 軌跡,代表系統 UI 算繪,而非遊戲的內部算繪管道。如要隔離遊戲,請取消主要 SQL 查詢 WHERE 子句中的選用篩選器註解,並將 'com.example.mygame' 替換成遊戲的套件名稱:

    -- AND p.name = 'com.example.mygame'
    -- AND t.name = 'RenderThread'
    
  • 暖身期:請務必在遊戲的主要 3D 場景完全載入,再記錄追蹤記錄。在啟動畫面或載入轉換期間擷取畫面,可能會導致初始化作業發生誤導。

LevelUp 豁免追蹤規定

如果您使用 Android Performance Analyzer (APA) 擷取追蹤記錄,以取得 Google Play Games LevelUp 計畫的豁免資格,追蹤記錄必須符合特定硬體需求,才算有效。

強烈建議您使用其中一個目標Level Up 參考裝置擷取追蹤記錄。

此外,為確保驗證準確無誤,請勿在採用 ANGLE GPU 的裝置上擷取追蹤記錄。具體來說,您無法使用下列裝置擷取 LevelUp 豁免追蹤記錄:

  • GPU 供應商為 SLSI (Samsung) 的任何裝置,這類裝置使用 AMD Xclipse GPU
  • Pixel 11