Unity 引擎的 VkQuality 外掛程式提供啟動時間建議 圖形 API (Vulkan 或 OpenGL ES) 可用於您的遊戲 裝置。
VkQuality 向 Unity 推薦比 Unity 更加受限制的裝置組合 引擎的預設允許清單使用 VkQuality 取得 Vulkan 同時限制 Vulkan 的使用範圍,僅限於採用較新圖形的較新裝置 。僅限 VkQuality 提供優質建議,而不是保證。 在建議裝置上遇到驅動程式問題VkQuality 支援自訂清單, 讓您新增或移除推薦的裝置 遊戲。
在 Unity 引擎遊戲中啟用 Vulkan
遊戲必須同時具備 OpenGL ES 和 Vulkan 轉譯器,才能使用 VkQuality 功能 可在 Unity 專案設定中啟用使用 Auto 啟用轉譯器 Graphics API 選項,或手動設定圖形 API。
取得 Unity 引擎的 VkQuality 外掛程式
從 GitHub 下載 VkQuality 外掛程式。外掛程式是 支援 Unity 2021 以上版本使用 Unity 2021 LTS 以上版本啟用 Android 上的 Vulkan。外掛程式套件包含基本範例專案,使用 這個外掛程式能在啟動時設定圖形 API,然後顯示 裝置上開啟的圖形 API。
管理 VkQuality Vulkan 推薦清單
VkQuality 包含支援裝置的預設建議清單。適用對象 請參閱使用自訂建議清單 建議清單一節
建議清單包含三個類別:
- Vulkan 裝置許可清單
- GPU 建議許可清單
- GPU 建議拒絕清單
裝置許可清單相符
Vkquality 會先檢查使用中的裝置是否允許
清單,以及應用程式是否執行最低 Android 版本和 Vulkan 驅動程式
裝置的許可清單中指定的版本。如果符合這些條件
VkQuality 建議透過傳回
RECOMMENDATION_VULKAN_BECAUSE_DEVICE_MATCH
列舉值。
裝置是否列在許可清單中,但裝置搭載的是 Android 版本或驅動程式
版本低於許可清單中指定的最低版本,VkQuality
系統會傳回 RECOMMENDATION_GLES_BECAUSE_OLD_DRIVER
來建議 OpenGL ES。
GPU 建議相符項目
如果裝置許可清單中沒有相符的裝置,VkQuality 會評估
根據 GPU 建議允許和拒絕的 GPU 模型和驅動程式版本
清單。如果 GPU 型號和驅動程式版本與 GPU 中的項目相符
VkQuality 建議清單,藉由傳回
RECOMMENDATION_VULKAN_BECAUSE_PREDICTION_MATCH
列舉常數。
如果 GPU 型號和驅動程式版本與 GPU 項目相符
建議拒絕清單,VkQuality 建議以 OpenGL ES 傳回
RECOMMENDATION_GLES_BECAUSE_PREDICTION_MATCH
。
不相符的建議
如果找不到相符項目,VkQuality 建議在 Android API 級別
執行中的裝置等於或高於
建議清單預設建議清單的 Future API 級別為
36 (即搭載 API 級別 36 以上版本的不相符裝置,VkQuality)
會傳回 RECOMMENDATION_VULKAN_BECAUSE_FUTURE_ANDROID
列舉常數。
如果在裝置許可清單或 GPU 建議清單中找不到相符項目,
且裝置的 API 級別低於 Future API 級別 (VkQuality)
系統會傳回 RECOMMENDATION_GLES_BECAUSE_NO_DEVICE_MATCH
來建議 OpenGL ES。
將 VkQuality 封存檔案新增至專案
VkQuality 外掛程式是 VkQuality-1.x.x.aar
檔案,位於
所下載套件封存檔的 Assets/Android/Plugins
目錄。
.aar 檔案的版本號碼與套件的版本號碼相符
封存的名稱如要安裝外掛程式,請按照下列步驟操作:
- 將 .aar 檔案複製到您的
Assets/Android/Plugins
目錄 專案。(建立必要的Android
和Plugins
子目錄,如果有的話) 不存在。)
![所需專案目錄中的 VkQuality .aar 檔案。](https://developer.android.com/static/images/games/engines/unity/unity-vkquality-unityassets.png?authuser=0000&hl=zh-tw)
- 在 Unity「Project」階層中選取
VkQuality-1.x.x
外掛程式檔案 在「Inspector」窗格中,顯示其「Import Settings」。請確認 已勾選 Android 平台,
![圖 2. VkQuality 外掛程式平台匯入設定。](https://developer.android.com/static/images/games/engines/unity/unity-vkquality-unityplugin.png?authuser=0000&hl=zh-tw)
使用自訂活動呼叫 VkQuality
與一般 Unity 引擎外掛程式不同,必須執行 VkQuality 才能取得 在 Unity 引擎初始化前,提供圖形 API 建議。接著,您會使用 使用 Unity 玩家指令列引數功能設定 圖形 API。在 Android 上 指令列引數需要覆寫 建立自訂的 UnityPlayerActivity,並建立自訂元件 活動。
如果您的遊戲已在使用自訂活動,請參閱將 VkQuality 新增至 現有的自訂活動部分。如要為 遊戲中,請參閱接下來的「在 Unity 專案中新增自訂活動」。
將自訂活動新增至 Unity 引擎專案
這個外掛程式中有使用 VkQuality 的自訂活動範例
Assets/Plugins/Android/VkQualityTestActivity.java
中的套件。
如要自訂檔案並在遊戲中使用,請按照下列步驟操作:
- 將
VkQualityTestActivity.java
檔案複製到您的Assets/Plugins/Android
目錄內。 - 請重新命名適合遊戲的名稱,例如
MyGameActivity.java
)。 - 使用文字編輯器開啟檔案。
- 將類別名稱從
VkQualityTestActivity
變更為您為專案指定的名稱 檔案 (例如MyGameActivity.java
)。 - 將套件名稱從
com.google.android.games.VkQualityTest
變更為 與 Unity 專案設定中「Package Name」欄位的值相符 「Other Settings」下的「Player」類別 (例如com.mycompany.mygame
)。 - 儲存並關閉檔案。
新增參照自訂活動的自訂資訊清單檔案,並告知 Unity 使用自訂資訊清單檔案:
- 從
Assets/Plugins/Android
複製AndroidManifest.xml
檔案 將外掛程式套件的目錄複製到專案的Asset/Plugins/Android
目錄。 - 使用文字編輯器開啟檔案。
- 將
activity android:name
設定的值從 將com.google.android.games.VkQualityTest.VkQualityTestActivity
設為 您在先前步驟中使用的套件名稱和活動名稱 (例如com.mycompany.mygame.MyGameActivity
)。 - 儲存並關閉檔案。
- 開啟 Unity 設定視窗,然後選取「Player」設定。展開 「Publishing Settings」部分,然後勾選「Custom Main Manifest」 核取方塊。
![圖 3. Unity Player 設定中的「Custom Main Manifest」選項。](https://developer.android.com/static/images/games/engines/unity/unity-vkquality-unitymanifest.png?authuser=0000&hl=zh-tw)
您的專案設定現已設定,可使用呼叫 VkQuality 的自訂活動 啟動,並根據 VkQuality 建議選擇 Vulkan 或 OpenGL ES。
將 VkQuality 新增至現有自訂活動
如果遊戲已有自訂活動覆寫預設值
UnityPlayerActivity
,新增
下列程式碼:
首先,將 VkQuality 匯入陳述式新增至頂端匯入清單 自訂活動檔案:
Kotlin
import com.google.android.games.vkquality.VKQuality;
Java
import com.google.android.games.vkquality.VKQuality;
接下來,請在 Activity
類別的主體中建立一些常數,以供
圖形 API 選擇:
Kotlin
companion object { private const val OVERRIDE_NONE = 0 private const val OVERRIDE_GLES = 1 private const val OVERRIDE_VULKAN = 2
Java
private static final int OVERRIDE_NONE = 0; private static final int OVERRIDE_GLES = 1; private static final int OVERRIDE_VULKAN = 2;
建立變數來追蹤 API 選項:
Kotlin
private var apiOverride = OVERRIDE_NONE
Java
private int apiOverride = OVERRIDE_NONE;
將下列函式新增至 Activity
類別:
Kotlin
private fun CheckVkQuality() { val vkQuality = VKQuality(this) val startResult = vkQuality.StartVkQuality("") if (startResult == VKQuality.INIT_SUCCESS) { // In the current release, we can assume GetVkQuality is // ready as soon as StartVkQuality has returned success. val getResult = vkQuality.GetVkQuality() LogVkQualityResult(getResult) apiOverride = when (getResult) { VKQuality.RECOMMENDATION_VULKAN_BECAUSE_DEVICE_MATCH, VKQuality.RECOMMENDATION_VULKAN_BECAUSE_PREDICTION_MATCH, VKQuality.RECOMMENDATION_VULKAN_BECAUSE_FUTURE_ANDROID -> OVERRIDE_VULKAN VKQuality.RECOMMENDATION_GLES_BECAUSE_OLD_DEVICE, VKQuality.RECOMMENDATION_GLES_BECAUSE_OLD_DRIVER, VKQuality.RECOMMENDATION_GLES_BECAUSE_NO_DEVICE_MATCH, VKQuality.RECOMMENDATION_GLES_BECAUSE_PREDICTION_MATCH -> OVERRIDE_GLES else -> OVERRIDE_GLES } vkQuality.StopVkQuality() } else { Log.e("VKQUALITY", "VkQuality start failed with result: $startResult") } }
Java
private void CheckVkQuality() { VKQuality vkQuality = new VKQuality(this); // An empty string specifies use of the default // built-in device list file. int startResult = vkQuality.StartVkQuality(""); if (startResult == VKQuality.INIT_SUCCESS) { // In the current release, we can assume GetVkQuality is // ready as soon as StartVkQuality has returned success. int getResult = vkQuality.GetVkQuality(); switch (getResult) { case VKQuality.RECOMMENDATION_VULKAN_BECAUSE_DEVICE_MATCH: case VKQuality.RECOMMENDATION_VULKAN_BECAUSE_PREDICTION_MATCH: case VKQuality.RECOMMENDATION_VULKAN_BECAUSE_FUTURE_ANDROID: apiOverride = OVERRIDE_VULKAN; break; case VKQuality.RECOMMENDATION_GLES_BECAUSE_OLD_DEVICE: case VKQuality.RECOMMENDATION_GLES_BECAUSE_OLD_DRIVER: case VKQuality.RECOMMENDATION_GLES_BECAUSE_NO_DEVICE_MATCH: case VKQuality.RECOMMENDATION_GLES_BECAUSE_PREDICTION_MATCH: default: apiOverride = OVERRIDE_GLES; break; } vkQuality.StopVkQuality(); } else { Log.e("VKQUALITY", "VkQuality start failed with result: " + startResult); } }
從 onCreate()
覆寫的頂端呼叫 CheckVkQuality
函式
函式,再呼叫基本類別實作:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { CheckVkQuality() super.onCreate(savedInstanceState) }
Java
@Override protected void onCreate(Bundle savedInstanceState) { CheckVkQuality(); super.onCreate(savedInstanceState); }
最後,新增 updateUnityCommandLineArguments()
函式的覆寫值
該函式會使用 apiOverride
的值將指令列引數傳遞至
Unity 引擎,用於指定要使用的圖形 API:
Kotlin
override fun updateUnityCommandLineArguments(cmdLine: String): String { if (apiOverride == OVERRIDE_VULKAN) { Log.i("VKQUALITY", "Passing -force-vulkan") return appendCommandLineArgument(cmdLine, "-force-vulkan") } else if (apiOverride == OVERRIDE_GLES) { Log.i("VKQUALITY", "Passing -force-gles") return appendCommandLineArgument(cmdLine, "-force-gles") } Log.i("VKQUALITY", "No override passed") // let Unity pick the Graphics API based on PlayerSettings return cmdLine } private fun appendCommandLineArgument(cmdLine: String, arg: String?): String { return if (arg == null || arg.isEmpty()) cmdLine else if (cmdLine == null || cmdLine.isEmpty()) arg else "$cmdLine $arg" }
Java
@Override protected String updateUnityCommandLineArguments(String cmdLine) { if (apiOverride == OVERRIDE_VULKAN) { Log.i("VKQUALITY", "Passing -force-vulkan"); return appendCommandLineArgument(cmdLine, "-force-vulkan"); } else if (apiOverride == OVERRIDE_GLES) { Log.i("VKQUALITY", "Passing -force-gles"); return appendCommandLineArgument(cmdLine, "-force-gles"); } Log.i("VKQUALITY", "No override passed"); // let Unity pick the Graphics API based on PlayerSettings return cmdLine; } private String appendCommandLineArgument(String cmdLine, String arg) { if (arg == null || arg.isEmpty()) return cmdLine; else if (cmdLine == null || cmdLine.isEmpty()) return arg; else return cmdLine + " " + arg; }
您的自訂活動現在會在啟動時呼叫 VkQuality,並選擇 Vulkan 或 OpenGL 根據 VkQuality 建議產生的 ES。
使用自訂推薦清單
傳遞檔案名稱,以指定自訂推薦清單檔案
,而不是傳送空白字串至 StartVkQuality()
:
Kotlin
val startResult = vkQuality.StartVkQuality("CUSTOM_FILE_NAME.vkq")
Java
int startResult = vkQuality.StartVkQuality("CUSTOM_FILE_NAME.vkq");
VkQuality 會先在應用程式的內部儲存空間尋找檔案
目錄。如果該檔案不在內部儲存空間中,VkQuality 會嘗試載入
從您的應用程式套件的素材資源中
擷取出適當檔案如果檔案不在上述任一位置
VkQuality 傳回 ERROR_MISSING_DATA_FILE
列舉值。
如要建立自訂推薦清單檔案,請使用 VkQuality 清單編輯器 GitHub 存放區中的工具。 工具位於其 README 中。