開始使用 Android 上的 Vulkan
Vulkan 是 Android 上的主要低階圖形 API,可為實作專屬遊戲引擎和算繪器的遊戲提供最佳效能。
如要在遊戲引擎中成功實作 Vulkan,您必須:
- 找出要搭配 Vulkan 使用的 Android 裝置
- 瞭解支援舊版 Android 裝置的利弊
- 將 Vulkan 加入您的 Android 建構目標
- 挑選可為 Vulkan 建立 SPIR-V 的著色器編譯器
- 在執行階段決定可用的 Vulkan API 版本
- 瞭解如何運用 Vulkan 設定檔、影格同步和預先旋轉功能,將 Vulkan 算繪作業最佳化
- 選取用於偵錯與效能分析的圖形工具
- 注意:如要瞭解如何將 Android 上的 Vulkan 與 Unity 或 Unreal 遊戲引擎搭配使用,請參閱:
- 搭配 Unity 使用 Vulkan
- 搭配 Unreal 使用 Vulkan
選擇適合 Vulkan 的最低裝置規格
Vulkan 適用於 Android 7.0 (API 級別 24) 以上版本。然而,並不是所有搭載 Android 7.0 以上版本的 Android 裝置都支援 Vulkan。此外,您也需判斷遊戲適用於哪些支援 Vulkan 的 Android 裝置。
建議
請將下列規格做為支援 Vulkan 的最低要求:
- 裝置需搭載 Android 10.0 (API 級別 29) 以上版本
- 裝置需支援 Vulkan API 1.1 以上版本
- 裝置的功能 (包括硬體功能) 需與 2022 年版 Android 基準設定檔相容
舊版裝置支援
如果您的遊戲設計是可在具備不同圖形功能的多種裝置上執行,那麼除了「選擇適合 Vulkan 的最低裝置規格」中建議的裝置外,您可能還需要為舊版裝置提供支援。在建構對舊版裝置的支援之前,請評估 Vulkan 是否能為遊戲帶來優勢。由於在 OpenGL ES 內發出繪製呼叫的成本較高,如果遊戲含有大量繪製呼叫,或是採用 OpenGL ES,就可能出現明顯的驅動程式負載。這類遊戲可能會在圖形驅動程式中耗費大量影格時間,因而受到 CPU 限制。不過,只要從 OpenGL ES 改成使用 Vulkan,遊戲就可以大幅降低 CPU 利用率和耗電量。如果遊戲中的複雜場景無法有效利用例項來減少繪製呼叫,就特別適合採取這種做法。由於目標裝置清單中,可能有部分裝置的 Vulkan 實作項目無法穩定執行遊戲,因此當您指定舊版裝置時,請將 OpenGL ES 算繪支援納入做為備用方案。
您可能會因為某些因素而不想支援舊版裝置,即使這類裝置之前支援 Vulkan 也一樣。這些因素包括效能與功能不足,或含有穩定性問題等。
效能與功能
對於執行遊戲所需的功能,支援 Vulkan 的舊款 Android 裝置有可能無法提供算繪效能或硬體相關支援。如果遊戲內有高保真圖像,且 Vulkan 是您在 Android 上唯一指定的 API,就特別可能發生這種情況。許多舊版裝置都只能使用 Vulkan API 1.0.3 版本,通常也無法支援廣泛用於新型硬體的 Vulkan 擴充功能。
穩定性
舊版 Android 裝置可能會使用過時的 Vulkan 驅動程式。這些驅動程式版本可能含有會影響遊戲穩定性的錯誤。如想解決驅動程式錯誤,可能需要投入大量的測試和工程時間。
將 Vulkan 新增至您的專案
如要在專案中加入 Vulkan,您需要:
- 加入 Vulkan API 標頭
- 將著色器程式碼編譯為 SPIR-V
- 在執行階段呼叫 Vulkan API
加入 Vulkan API 標頭
遊戲需要加入 Vulkan API 標頭檔案,才能編譯採用 Vulkan 的程式碼。您可以在 Android NDK 中找到 Vulkan 標頭副本,但這也可能封裝在 Vulkan SDK 版本中。任何特定的 NDK 版本都僅含有 NDK 發布時可用的 Vulkan 標頭。如果您使用 NDK 的 Vulkan 標頭,請採用 NDK 25 以上版本,其中含有支援 Vulkan 1.3 版的標頭檔案。Vulkan SDK 則具備最新版的標頭。
將著色器程式碼編譯為 SPIR-V
Vulkan API 要求著色器程式以 SPIR-V 二進位中繼格式提供。此慣例與 OpenGL ES 不同,在 OpenGL ES 中,您可以將使用 OpenGL 著色語言 (GLSL) 編寫的原始碼做為文字字串提交。請使用著色器編譯器,擷取以 GLSL 或高階著色器語言 (HLSL) 編寫的程式碼,並將其編譯為 SPIR-V 模組,以便與 Vulkan 搭配使用。
以 GLSL 編寫的著色器程式可透過 shaderc 編譯器編譯為 SPIR-V。如果您的遊戲使用 HLSL,DirectXShaderCompiler 可支援 SPIR-V 輸出內容。一般而言,您會在遊戲的資產建構程序中,以離線方式編譯著色器程式,並將 SPIR-V 模組納入執行階段資產中。
在執行階段呼叫 Vulkan API
如要呼叫 Vulkan API,遊戲需取得指向 Vulkan API 呼叫的函式指標。最簡單的做法是連結至 Android NDK 中的 libvulkan.so
共用資料庫。不過,連結程式庫有兩個缺點:額外的函式調度負擔,以及自動解析 Vulkan API 函式指標的限制。
當您呼叫 Vulkan API 函式時,控制項會經由建構項目管理的調度資料表來傳遞,這個建構項目又稱為 Vulkan 載入器。Android 所用的是自身專屬的 Vulkan 載入器實作項目,而非 LunarG 載入器。這個載入器系統是 Vulkan API 層架構的一環。如果在建構期間連結至系統程式庫,會導致系統為特定的 API 呼叫產生額外的分派層級。雖然負擔不大,但如果遊戲會執行大量 Vulkan 呼叫,可能就會受到明顯影響。
系統程式庫通常只會解析指向屬於核心 API 一環的 Vulkan 函式指標。Vulkan 提供多種擴充功能,可定義額外的 Vulkan 函式,其中許多函式不會由系統程式庫自動解析。您需先手動解析這些 Vulkan 函式的指標,才能使用指標。
為減少這類問題,請以動態方式解析您想在執行階段使用的所有 Vulkan 函式指標。其中一個方法是使用開放原始碼中繼載入器程式庫,例如 volk。為此,AGDKTunnel 範例遊戲整合了 volk。如果您使用中繼載入器程式庫,請勿在建構指令碼中連結到 libvulkan.so
共用資料庫。
決定可用的 Vulkan API 版本
Android 支援下列 Vulkan API 版本:
- 1.0.3
- 1.1
- 1.3
在特定裝置上可使用的最高 Vulkan API 版本號碼,需視 Android 版本和 Vulkan 驅動程式的支援情況而定。
Android 版本
Vulkan API 版本的平台支援,取決於最低 Android 版本 (API 級別):
- 1.3 - Android 13.0 (API 級別 33) 以上版本
- 1.1 - Android 10.0 (API 層級 29) 以上版本
- 1.0.3 - Android 7.0 (API 級別 24) 以上版本
Vulkan 驅動程式支援
Android 平台支援某個 Vulkan API 版本,並不保證裝置的 Vulkan API 驅動程式也支援該 API 版本。搭載 Android 13 的裝置可能僅支援 1.1 版的 Vulkan API。
因此,當您初始化 Vulkan 時,請勿要求 API 版本必須高於:
- 裝置上搭載的 Android 版本適用的最高 Vulkan API 版本
- vkEnumerateInstanceVersion 回報的 Vulkan API 版本
- VkPhysicalDeviceProperties 結構的
apiVersion
屬性回報的 Vulkan API 版本
以下舉例說明如何判斷支援的最高 Vulkan API 版本:
// Minimum Android API levels for Vulkan 1.3/1.1 version support
static constexpr int kMinimum_vk13_api_level = 33;
static constexpr int kMinimum_vk11_api_level = 29;
uint32_t GetHighestSupportedVulkanVersion(VkPhysicalDevice physical_device) {
uint32_t instance_api_version = 0;
vkEnumerateInstanceVersion(&instance_api_version);
VkPhysicalDeviceProperties device_properties;
vkGetPhysicalDeviceProperties(physical_device, &device_properties);
// Instance and device versions don't have to match, use the lowest version
// number for API support if they don't.
const uint32_t driver_api_version =
(instance_api_version < device_properties.apiVersion) ?
instance_api_version : device_properties.apiVersion;
const int device_api_level = android_get_device_api_level();
if (device_api_level >= kMinimum_vk13_api_level &&
driver_api_version >= VK_API_VERSION_1_3) {
return VK_API_VERSION_1_3;
} else if (device_api_level >= kMinimum_vk11_api_level &&
driver_api_version >= VK_API_VERSION_1_1) {
return VK_API_VERSION_1_1;
}
return VK_API_VERSION_1_0;
}
判斷 Vulkan 設定檔的相容性
Vulkan 設定檔是 JSON 檔案,用於定義一組必要功能、擴充功能、一般功能和最低參數限制,Vulkan 裝置必須支援上述內容才能與設定檔相容。如要判斷裝置是否與特定 Vulkan 設定檔 (例如 2022 年版 Android 基準設定檔) 相容,請使用開放原始碼 Vulkan Profiles API 程式庫。您也可以使用相關的 Vulkan API 自行剖析設定檔 JSON 檔案,並查詢裝置功能,藉此判斷設定檔相容性。
Vulkan 設定檔
Android 使用 Vulkan 設定檔,定義執行 Android 的每部裝置可用的功能和擴充功能。
Android 基準設定檔 (ABP) 是建構 Vulkan 設定檔的首次嘗試。ABP2021 和 ABP2022 是回溯性質的設定檔,旨在涵蓋當下超過 85% 的使用中裝置。日後不會有任何新的 ABP。
Android 適用的 Vulkan 設定檔 (VPA) 是全新的前瞻性設定檔,旨在反映軟體開發人員的需求,並在硬體開發人員提供一致功能時,盡快推動這些功能。VPA15_minimums 是 Android 15 的第一個設定檔,每年都會推出新的 VPA,涵蓋每個主要的 Android 版本。
實作影格同步功能
妥當的影格同步功能,是提供優質遊戲體驗的重要環節。Android Game Development Kit 內含 Frame Pacing Library,有助於遊戲達到最佳的影格同步速度。如要進一步瞭解實作詳情,請參閱「將 Android Frame Pacing 整合至 Vulkan 轉譯器」。
實作預先旋轉功能
Android 裝置可以採用多種螢幕方向。裝置螢幕方向不一定要等同於算繪介面方向。Vulkan 不會處理兩者間的差異,這與 Android 上的 OpenGL ES 不一樣。如要瞭解使用 Vulkan 時螢幕方向程序的運作方式,以及處理螢幕方向差異的最佳方法,請參閱「使用 Vulkan 預旋轉功能處理裝置方向」。
疑難排解及剖析 Vulkan 算繪問題
我們提供多項工具,可協助您診斷 Vulkan 算繪程式碼的算繪問題和效能問題。
如要進一步瞭解 Vulkan 的偵錯和分析工具,請參閱「工具與進階功能」一節。
Vulkan 驗證層
您可以啟用 Vulkan 驗證層這個執行階段程式庫,檢查對 Vulkan API 的呼叫,並獲得有關不正確/非理想用途的警告或錯誤通知。根據預設,這些驗證層不會啟用,因為驗證程序會增加執行階段負擔,進而影響遊戲效能。如要瞭解如何在遊戲中使用驗證層,請參閱「使用驗證層進行偵錯」。
影格擷取工具
影格擷取工具可用於錄製及重播遊戲影格期間發出的 Vulkan API 呼叫。這些工具有助您:
- 查看使用中圖像資源的資訊和圖表
- 查看遊戲發出的 API 呼叫序列以及 API 參數
- 探索繪製呼叫時圖像管道的狀態
- 在影格中以視覺化方式呈現截至特定繪製呼叫之前的算繪結果
請使用開放原始碼 RenderDoc 工具,從在 Android 上執行的遊戲中擷取影格。RenderDoc 同時支援 Vulkan 和 OpenGL ES 的影格擷取作業。
Android GPU 檢查器 (AGI) 也可用來擷取 Vulkan 影格。
效能分析工具
使用效能分析工具,即可調查遊戲中造成影格速率不佳的轉譯問題。各家 GPU 供應商皆有自己專門用來分析遊戲的工具,也會提供自家 GPU 架構專屬的效能資料。不論您是在不同供應商的 GPU 上、還是在同一供應商的不同代 GPU 上執行算繪,遊戲的效能特性和瓶頸元素都可能會呈現顯著差異。
您也可以使用 Android GPU 檢查器收集及分析效能資料。有別於供應商工具,Android GPU 檢查器可與多家供應商的各種 GPU 相容。不過,Android GPU 檢查器不支援舊版 Android 裝置,且可能無法與部分新裝置相容。
使用 CTS-D 改善 Vulkan 測試
搭載 Android 的裝置製造商會使用 Compatibility Test Suite (CTS),確保自家裝置的相容性。開發人員提供的 CTS (CTS-D) 是由 Android 應用程式開發人員提交的測試,可確保日後的 Android 裝置滿足其用途,且能夠順暢執行應用程式,且不會發生錯誤。
如果您使用 Vulkan 應用程式觸發了會影響特定 Android 裝置的新錯誤,可以提交新的測試提案,並說明問題和檢查方式。這麼做可確保裝置日後的更新會修正這個問題,也能確保其他裝置不會發生相同的錯誤。
請參閱 CTS 提交程序,瞭解如何提交測試提案的逐步操作說明。