開發或最佳化 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」分頁:開啟追蹤記錄分析畫面後,在 UI 的導覽選單中,按一下「SQL」分頁,開啟追蹤記錄處理器環境,直接查詢資料。
在 APA SQL 分頁中貼上下列 SQL 查詢:複製下列 SQL 查詢,並貼到查詢輸入欄位。這項查詢會掃描追蹤記錄,找出繪圖 API 事件,例如
eglSwapBuffers、QueuePresentKHR和vkQueuePresentKHR。並依程序名稱分組,計算 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;執行查詢:按一下輸入欄位附近的「執行查詢」按鈕。 查詢執行完畢後,結果窗格會顯示表格,其中包含程序名稱 (
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