VkQuality Unity 引擎外掛程式

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 檔案的版本號碼與套件的版本號碼相符 封存的名稱如要安裝外掛程式,請按照下列步驟操作:

  1. 將 .aar 檔案複製到您的 Assets/Android/Plugins 目錄 專案。(建立必要的 AndroidPlugins 子目錄,如果有的話) 不存在。)
,瞭解如何調查及移除這項存取權。
所需專案目錄中的 VkQuality .aar 檔案。
圖 1:必要專案目錄中的 VkQuality .aar 檔案。
  1. 在 Unity「Project」階層中選取 VkQuality-1.x.x 外掛程式檔案 在「Inspector」窗格中,顯示其「Import Settings」。請確認 已勾選 Android 平台,
圖 2. VkQuality 外掛程式平台匯入設定。
圖 2. VkQuality 外掛程式平台匯入設定。

使用自訂活動呼叫 VkQuality

與一般 Unity 引擎外掛程式不同,必須執行 VkQuality 才能取得 在 Unity 引擎初始化前,提供圖形 API 建議。接著,您會使用 使用 Unity 玩家指令列引數功能設定 圖形 API。在 Android 上 指令列引數需要覆寫 建立自訂的 UnityPlayerActivity,並建立自訂元件 活動

如果您的遊戲已在使用自訂活動,請參閱將 VkQuality 新增至 現有的自訂活動部分。如要為 遊戲中,請參閱接下來的「在 Unity 專案中新增自訂活動」。

將自訂活動新增至 Unity 引擎專案

這個外掛程式中有使用 VkQuality 的自訂活動範例 Assets/Plugins/Android/VkQualityTestActivity.java 中的套件。 如要自訂檔案並在遊戲中使用,請按照下列步驟操作:

  1. VkQualityTestActivity.java 檔案複製到您的 Assets/Plugins/Android 目錄內。
  2. 請重新命名適合遊戲的名稱,例如 MyGameActivity.java)。
  3. 使用文字編輯器開啟檔案。
  4. 將類別名稱從 VkQualityTestActivity 變更為您為專案指定的名稱 檔案 (例如 MyGameActivity.java)。
  5. 將套件名稱從 com.google.android.games.VkQualityTest 變更為 與 Unity 專案設定中「Package Name」欄位的值相符 「Other Settings」下的「Player」類別 (例如 com.mycompany.mygame)。
  6. 儲存並關閉檔案。

新增參照自訂活動的自訂資訊清單檔案,並告知 Unity 使用自訂資訊清單檔案:

  1. Assets/Plugins/Android 複製 AndroidManifest.xml 檔案 將外掛程式套件的目錄複製到專案的 Asset/Plugins/Android 目錄。
  2. 使用文字編輯器開啟檔案。
  3. activity android:name 設定的值從 將 com.google.android.games.VkQualityTest.VkQualityTestActivity 設為 您在先前步驟中使用的套件名稱和活動名稱 (例如 com.mycompany.mygame.MyGameActivity)。
  4. 儲存並關閉檔案。
  5. 開啟 Unity 設定視窗,然後選取「Player」設定。展開 「Publishing Settings」部分,然後勾選「Custom Main Manifest」 核取方塊。
,瞭解如何調查及移除這項存取權。
圖 3. Unity Player 設定中的「Custom Main Manifest」選項。
圖 3:Unity Player 設定中的「Custom Main Manifest」選項。

您的專案設定現已設定,可使用呼叫 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 中。