開發或最佳化 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 的使用情形:
使用 APA 擷取追蹤記錄:執行遊戲,並使用 APA 擷取要分析的區段 (例如懷疑影格掉落的遊戲時間點) 的系統追蹤記錄。裝置連線且追蹤記錄完成後,追蹤資料會載入 APA 介面。
在 APA 中按一下「SQL」分頁標籤:開啟追蹤記錄分析畫面後,在使用者介面的導覽選單中,按一下「SQL」分頁標籤,開啟追蹤記錄處理器環境,即可直接查詢資料。
將下列 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;執行查詢:點選輸入欄位附近的「執行查詢」按鈕。查詢執行後,結果窗格中會顯示表格,其中包含程序名稱 (
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