Trình bổ trợ công cụ Unity VkQuality Vk

Trình bổ trợ VkQuality cho công cụ Unity cung cấp các đề xuất về thời gian khởi chạy của API đồ hoạ – Vulkan hoặc OpenGL ES – để sử dụng cho trò chơi của bạn trên thiết bị.

VkQuality đề xuất Vulkan trên một tập hợp thiết bị hạn chế hơn so với Unity danh sách cho phép mặc định của công cụ. Sử dụng VkQuality để nhận được các lợi ích về hiệu suất của Vulkan, đồng thời chỉ giới hạn việc sử dụng Vulkan cho các thiết bị mới có đồ hoạ mới hơn trình điều khiển, giúp hạn chế việc trò chơi của bạn gặp phải các vấn đề về người lái xe. Chỉ VkQuality đưa ra các đề xuất có chất lượng, chứ không phải đảm bảo, vì vẫn có thể gặp phải vấn đề về trình điều khiển trên các thiết bị được khuyến nghị. VkQuality hỗ trợ các danh sách tuỳ chỉnh, cho phép bạn thêm hoặc xóa các đề xuất theo thiết bị cho của bạn.

Bật Vulkan trong công cụ phát triển trò chơi Unity

VkQuality yêu cầu trò chơi của bạn phải có cả trình kết xuất OpenGL ES và Vulkan bật trong phần cài đặt dự án Unity. Bật trình kết xuất bằng cách sử dụng nút Tự động Tuỳ chọn Graphics API hoặc bằng cách cài đặt thủ công các API đồ hoạ.

Tải trình bổ trợ VkQuality cho công cụ Unity

Tải trình bổ trợ VkQuality trên GitHub. Trình bổ trợ là tương thích với Unity 2021 trở lên. Sử dụng Unity LTS 2021 trở lên để bật Vulkan trên Android. Gói trình bổ trợ chứa một dự án mẫu cơ bản sử dụng trình bổ trợ để thiết lập API đồ hoạ khi khởi động, sau đó hiển thị một chuỗi được đặt thành API đồ hoạ đang hoạt động của thiết bị.

Quản lý danh sách đề xuất VkQuality Vulkan

VkQuality bao gồm một danh sách đề xuất mặc định gồm các thiết bị được hỗ trợ. Cho thông tin về cách sử dụng danh sách đề xuất tùy chỉnh, hãy xem bài viết Sử dụng danh sách đề xuất tùy chỉnh danh sách đề xuất.

Danh sách đề xuất bao gồm 3 danh mục:

  • Danh sách thiết bị Vulkan cho phép
  • Danh sách cho phép đề xuất GPU
  • Danh sách từ chối đề xuất GPU

Kết quả trùng khớp trong danh sách thiết bị cho phép

Trước tiên, VkQuality kiểm tra xem thiết bị đang hoạt động có được đưa vào thiết bị cho phép hay không và phiên bản đó có đang chạy phiên bản Android tối thiểu cũng như trình điều khiển Vulkan hay không phiên bản được chỉ định trong danh sách cho phép của thiết bị đó. Nếu đáp ứng các tiêu chí này, VkQuality đề xuất Vulkan bằng cách trả về Giá trị enum RECOMMENDATION_VULKAN_BECAUSE_DEVICE_MATCH.

Nếu thiết bị có trong danh sách cho phép, nhưng đang chạy phiên bản Android hoặc trình điều khiển có phiên bản thấp hơn phiên bản tối thiểu được chỉ định trong danh sách cho phép VkQuality đề xuất OpenGL ES bằng cách trả về RECOMMENDATION_GLES_BECAUSE_OLD_DRIVER.

So khớp đề xuất GPU

Nếu không tìm thấy thiết bị phù hợp trong danh sách cho phép thiết bị, VkQuality sẽ đánh giá Mô hình GPU và phiên bản trình điều khiển dựa trên đề xuất cho phép và từ chối GPU danh sách. Nếu kiểu GPU và phiên bản trình điều khiển khớp với một mục nhập trong GPU danh sách cho phép đề xuất, VkQuality đề xuất Vulkan bằng cách trả về Hằng số enum RECOMMENDATION_VULKAN_BECAUSE_PREDICTION_MATCH.

Nếu kiểu GPU và phiên bản trình điều khiển khớp với một mục nhập trong GPU danh sách từ chối đề xuất, VkQuality đề xuất OpenGL ES bằng cách trả lại RECOMMENDATION_GLES_BECAUSE_PREDICTION_MATCH.

Các đề xuất không có kết quả phù hợp

Nếu không tìm thấy kết quả trùng khớp, VkQuality đề xuất Vulkan nếu cấp độ API Android là thiết bị đang chạy bằng hoặc cao hơn cấp độ Future API trong danh sách đề xuất. Danh sách đề xuất mặc định có cấp độ Future API là 36, nghĩa là trên các thiết bị chưa từng có chạy API cấp 36 trở lên, VkQuality sẽ trả về hằng số enum RECOMMENDATION_VULKAN_BECAUSE_FUTURE_ANDROID.

Nếu không tìm thấy kết quả trùng khớp trong danh sách cho phép thiết bị hoặc danh sách đề xuất GPU, và cấp độ API của thiết bị thấp hơn cấp độ API tương lai, VkQuality đề xuất OpenGL ES bằng cách trả về RECOMMENDATION_GLES_BECAUSE_NO_DEVICE_MATCH.

Thêm tệp lưu trữ VkQuality vào dự án

Trình bổ trợ VkQuality là tệp VkQuality-1.x.x.aar nằm trong Thư mục Assets/Android/Plugins của tệp lưu trữ gói đã tải xuống. Dữ liệu thực tế số phiên bản của tệp .aar khớp với số phiên bản của gói tên tệp lưu trữ. Để cài đặt trình bổ trợ này, hãy thực hiện các bước sau:

  1. Sao chép tệp .aar vào thư mục Assets/Android/Plugins trong dự án. (Tạo các thư mục con AndroidPlugins cần thiết nếu chúng không tồn tại.)
Tệp VkQuality .aar trong thư mục dự án bắt buộc.
Hình 1.Tệp VkQuality .aar trong thư mục dự án bắt buộc.
  1. Chọn tệp trình bổ trợ VkQuality-1.x.x trong hệ phân cấp Dự án của Unity hiển thị mục Import Settings (Cài đặt nhập) trong ngăn Inspector (Trình kiểm tra). Đảm bảo rằng Nền tảng Android đã được đánh dấu.
Hình 2. Chế độ cài đặt nhập nền tảng trình bổ trợ VkQuality.
Hình 2. Chế độ cài đặt nhập nền tảng trình bổ trợ VkQuality.

Sử dụng một hoạt động tuỳ chỉnh để gọi VkQuality

Không giống như các trình bổ trợ công cụ Unity thông thường, VkQuality phải được thực thi để có được một đề xuất API đồ hoạ trước khi khởi chạy công cụ Unity. Sau đó, bạn sử dụng tính năng đối số dòng lệnh của trình phát Unity để đặt giá trị đồ hoạ dựa trên đề xuất VkQuality. Trên Android, truyền đối số dòng lệnh yêu cầu ghi đè hành vi mặc định của UnityPlayerActivity bằng cách tạo một đối tượng tuỳ chỉnh hoạt động.

Nếu trò chơi của bạn đang sử dụng một hoạt động tuỳ chỉnh, hãy xem phần Thêm VkQuality vào hoạt động tuỳ chỉnh hiện có. Để tạo một hoạt động tuỳ chỉnh mới cho hãy xem nội dung Thêm hoạt động tuỳ chỉnh vào dự án Unity ở phần tiếp theo.

Thêm hoạt động tuỳ chỉnh vào dự án công cụ Unity

Một mẫu hoạt động tuỳ chỉnh sử dụng VkQuality được bao gồm trong trình bổ trợ gói trong Assets/Plugins/Android/VkQualityTestActivity.java. Để tuỳ chỉnh và sử dụng tệp này trong trò chơi, hãy làm theo các bước sau:

  1. Sao chép tệp VkQualityTestActivity.java vào Thư mục Assets/Plugins/Android.
  2. Đổi tên thành tên phù hợp với trò chơi của bạn (ví dụ: MyGameActivity.java).
  3. Mở tệp trong một trình chỉnh sửa văn bản.
  4. Thay đổi tên lớp từ VkQualityTestActivity thành tên mà bạn đã đặt (ví dụ: MyGameActivity.java).
  5. Thay đổi tên gói từ com.google.android.games.VkQualityTest thành khớp với giá trị của trường Package Name (Tên gói) trong phần Cài đặt dự án Unity Danh mục Người chơi trong mục Chế độ cài đặt khác (ví dụ: com.mycompany.mygame).
  6. Lưu và đóng tệp.

Thêm một tệp kê khai tuỳ chỉnh tham chiếu đến hoạt động tuỳ chỉnh của bạn và thông báo cho Unity để sử dụng tệp kê khai tuỳ chỉnh:

  1. Sao chép tệp AndroidManifest.xml từ Assets/Plugins/Android Thư mục của gói trình bổ trợ vào Asset/Plugins/Android của dự án thư mục.
  2. Mở tệp trong một trình chỉnh sửa văn bản.
  3. Thay đổi giá trị của chế độ cài đặt activity android:name từ com.google.android.games.VkQualityTest.VkQualityTestActivity vào tên gói và hoạt động mà bạn đã sử dụng ở các bước trước (ví dụ: com.mycompany.mygame.MyGameActivity).
  4. Lưu và đóng tệp.
  5. Mở cửa sổ cài đặt Unity rồi chọn chế độ cài đặt Player (Trình phát). Mở rộng phần Cài đặt xuất bản rồi chọn Tệp kê khai chính tuỳ chỉnh hộp kiểm.
Hình 3.Tuỳ chọn Custom Main Manifest (Tệp kê khai chính tuỳ chỉnh) trong phần cài đặt Unity Player.
Hình 3. Tuỳ chọn Tệp kê khai chính tuỳ chỉnh trong phần cài đặt Trình phát của Unity.

Dự án của bạn hiện đã được thiết lập để sử dụng hoạt động tuỳ chỉnh gọi VkQuality tại khởi động và chọn Vulkan hoặc OpenGL ES dựa trên đề xuất VkQuality.

Thêm VkQuality vào một hoạt động tuỳ chỉnh hiện có

Nếu trò chơi của bạn đã có hoạt động tuỳ chỉnh ghi đè hoạt động mặc định UnityPlayerActivity, tích hợp các đề xuất VkQuality bằng cách thêm mã sau:

Trước tiên, hãy thêm câu lệnh nhập VkQuality vào danh sách lệnh nhập ở đầu tệp hoạt động tuỳ chỉnh:

Kotlin

import com.google.android.games.vkquality.VKQuality;

Java

import com.google.android.games.vkquality.VKQuality;

Tiếp theo, hãy tạo một số hằng số trong phần nội dung của lớp Activity cho giá trị Lựa chọn API đồ hoạ:

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;

Tạo một biến để theo dõi lựa chọn API:

Kotlin

private var apiOverride = OVERRIDE_NONE

Java

private int apiOverride = OVERRIDE_NONE;

Thêm hàm sau vào lớp 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);
  }
}

Gọi hàm CheckVkQuality từ đầu ghi đè onCreate() trước khi gọi phương thức triển khai lớp cơ sở:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
  CheckVkQuality()
  super.onCreate(savedInstanceState)
}

Java

@Override
protected void onCreate(Bundle savedInstanceState) {
    CheckVkQuality();
    super.onCreate(savedInstanceState);
}

Cuối cùng, hãy thêm cơ chế ghi đè hàm updateUnityCommandLineArguments() sử dụng giá trị apiOverride để chuyển đối số dòng lệnh đến Công cụ Unity chỉ định API đồ hoạ nào cần sử dụng:

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;
}

Hoạt động tuỳ chỉnh của bạn hiện gọi VkQuality khi khởi động và chọn Vulkan hoặc OpenGL ES dựa trên đề xuất VkQuality.

Sử dụng danh sách đề xuất tuỳ chỉnh

Chỉ định tệp danh sách đề xuất tuỳ chỉnh bằng cách chuyển tên của tệp đó chứa danh sách vào StartVkQuality() thay vì truyền một chuỗi trống:

Kotlin

val startResult = vkQuality.StartVkQuality("CUSTOM_FILE_NAME.vkq")

Java

int startResult = vkQuality.StartVkQuality("CUSTOM_FILE_NAME.vkq");

Trước tiên, VkQuality tìm tệp trong bộ nhớ trong của ứng dụng thư mục. Nếu tệp không ở bộ nhớ trong, VkQuality cố gắng tải từ nội dung của gói ứng dụng. Nếu tệp không nằm ở một trong hai vị trí, VkQuality trả về giá trị enum ERROR_MISSING_DATA_FILE.

Để tạo một tệp danh sách đề xuất tuỳ chỉnh, hãy sử dụng Trình chỉnh sửa danh sách VkQuality trong kho lưu trữ GitHub. Tài liệu về nằm trong tệp README của nó.