判斷遊戲算繪 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」分頁標籤:開啟追蹤記錄分析畫面後,在使用者介面的導覽選單中,按一下「SQL」分頁標籤,開啟追蹤記錄處理器環境,即可直接查詢資料。

  3. 將下列 SQL 查詢貼到 APA SQL 分頁:複製下列 SQL 查詢,並貼到查詢輸入欄位。這項查詢會掃描追蹤記錄,找出繪圖 API 事件,例如 eglSwapBuffers、QueuePresentKHR 和 vkQueuePresentKHR。並依程序名稱分組,計算轉譯 API 數量,以及 Vulkan 與 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. 執行查詢:點選輸入欄位附近的「執行查詢」按鈕。查詢執行後,結果窗格中會顯示表格,其中包含程序名稱 (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