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 tại thời điểm chạy API đồ hoạ (Vulkan hoặc OpenGL ES) để sử dụng cho trò chơi của bạn trên các thiết bị cụ thể.

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

Bật Vulkan trong trò chơi công cụ Unity

VkQuality yêu cầu trò chơi của bạn phải bật cả trình kết xuất OpenGL ES và Vulkan trong phần cài đặt dự án Unity. Bật trình kết xuất bằng cách sử dụng tuỳ chọn Auto Graphics API (API Đồ hoạ tự động) hoặc 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ợ này tương thích với Unity 2021 trở lên. Sử dụng phiên bản Unity LTS 2021 trở lên để hỗ trợ 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 cho API đồ hoạ đang hoạt động của thiết bị.

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

VkQuality bao gồm một danh sách đề xuất mặc định gồm các thiết bị được hỗ trợ. Để biết thông tin về cách sử dụng một danh sách đề xuất tuỳ chỉnh, hãy xem phần Sử dụng danh sách đề xuất tuỳ chỉnh.

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

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

Khớp với danh sách cho phép thiết bị

Trước tiên, VkQuality sẽ kiểm tra xem thiết bị đang hoạt động có trong danh sách cho phép của thiết bị hay không, cũng như liệu thiết bị đó có đang chạy phiên bản Android tối thiểu cũng như phiên bản trình điều khiển Vulkan được chỉ định trong danh sách cho phép của thiết bị đó hay không. Nếu đáp ứng các tiêu chí này, VkQuality sẽ đề 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 phiên bản trình điều khiển thấp hơn mức tối thiểu được chỉ định cho thiết bị trong danh sách cho phép, thì VkQuality sẽ đề xuất OpenGL ES bằng cách trả về RECOMMENDATION_GLES_BECAUSE_OLD_DRIVER.

Kết quả đề xuất về GPU trùng khớp

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

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

Nội dung đề xuất không khớ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 của thiết bị đang chạy bằng hoặc cao hơn cấp độ API tương lai trong danh sách đề xuất. Danh sách đề xuất mặc định có cấp độ API tương lai là 36, nghĩa là trên các thiết bị không khớp với 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 của thiết bị hoặc danh sách đề xuất GPU, đồng thời cấp độ API của thiết bị thấp hơn cấp độ API tương lai, VkQuality sẽ đề 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 của bạ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 kho lưu trữ gói đã tải xuống. Số phiên bản thực tế của tệp .aar khớp với số phiên bản của tên kho lưu trữ gói. Để cài đặt trình bổ trợ, 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 của dự án. (Tạo các thư mục con AndroidPlugins cần thiết nếu chúng chưa 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 Project (Dự án) của Unity để hiện Import Settings (Cài đặt nhập) của tệp đó trong ngăn Inspector (Trình kiểm tra). Hãy nhớ chọn nền tảng Android.
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, bạn phải thực thi VkQuality để nhận đề xuất về API đồ hoạ trước khi khởi động 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 API đồ hoạ dựa trên đề xuất VkQuality. Trên Android, việc 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 hoạt động tuỳ chỉnh.

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 một hoạt động tuỳ chỉnh hiện có. Để tạo một hoạt động tuỳ chỉnh mới cho trò chơi, hãy xem phần Thêm hoạt động tuỳ chỉnh vào dự án Unity của bạn ở phần tiếp theo.

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

Một hoạt động tuỳ chỉnh mẫu sử dụng VkQuality sẽ có trong gói trình bổ trợ 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 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 đã cung cấp cho tệp (ví dụ: MyGameActivity.java).
  5. Thay đổi tên gói từ com.google.android.games.VkQualityTest để khớp với giá trị của trường Package Name (Tên gói) trong danh mục Player (Trình phát) trong phần Other Settings (Cài đặt khác) (ví dụ: com.mycompany.mygame).
  6. Lưu và đóng tệp.

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

  1. Sao chép tệp AndroidManifest.xml từ thư mục Assets/Plugins/Android của gói trình bổ trợ vào thư mục Asset/Plugins/Android của dự án.
  2. Mở tệp trong 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 thành tên gói và hoạt động mà bạn đã sử dụng trong 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 phát hành rồi chọn hộp đánh dấu Tệp kê khai chính tuỳ chỉnh.
Hình 3.Tuỳ chọn Custom 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 Player 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 khi 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ó một hoạt động tuỳ chỉnh ghi đè UnityPlayerActivity mặc định, hãy tích hợp các đề xuất VkQuality bằng cách thêm đoạn mã sau:

Trước tiên, hãy thêm câu lệnh nhập VkQuality vào danh sách 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 các 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 một hàm 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 để truyền một đối số dòng lệnh đến công cụ Unity chỉ định API đồ hoạ 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 sẽ gọi Vkquality khi khởi động và chọn Vulkan hoặc OpenGL ES dựa trên đề xuất về VkQuality.

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

Chỉ định một 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ì chuyể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 sẽ tìm tệp trong thư mục bộ nhớ trong của ứng dụng. Nếu tệp không có trong bộ nhớ trong, VkQuality sẽ cố gắng tải tệp này từ các thành phần của gói ứng dụng. Nếu tệp không nằm ở một trong hai vị trí, VkQuality sẽ 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 công cụ VkQuality List Editor trong kho lưu trữ GitHub. Tài liệu cho công cụ này nằm trong tệp README.