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:
- Sao chép tệp .aar vào thư mục
Assets/Android/Plugins
trong dự án. (Tạo các thư mục conAndroid
vàPlugins
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.](https://developer.android.com/static/images/games/engines/unity/unity-vkquality-unityassets.png?authuser=19&hl=vi)
- 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.](https://developer.android.com/static/images/games/engines/unity/unity-vkquality-unityplugin.png?authuser=19&hl=vi)
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:
- Sao chép tệp
VkQualityTestActivity.java
vào Thư mụcAssets/Plugins/Android
. - Đổi tên thành tên phù hợp với trò chơi của bạn (ví dụ:
MyGameActivity.java
). - Mở tệp trong một trình chỉnh sửa văn bản.
- Thay đổi tên lớp từ
VkQualityTestActivity
thành tên mà bạn đã đặt (ví dụ:MyGameActivity.java
). - 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
). - 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:
- Sao chép tệp
AndroidManifest.xml
từAssets/Plugins/Android
Thư mục của gói trình bổ trợ vàoAsset/Plugins/Android
của dự án thư mục. - Mở tệp trong một trình chỉnh sửa văn bản.
- 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
). - Lưu và đóng tệp.
- 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.](https://developer.android.com/static/images/games/engines/unity/unity-vkquality-unitymanifest.png?authuser=19&hl=vi)
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ó.