Làm quen với Vulkan trên Android
Vulkan là API đồ hoạ chính cấp thấp trên Android. Vulkan mang lại hiệu suất tối ưu cho những trò chơi triển khai công cụ phát triển trò chơi và trình kết xuất riêng.
Để triển khai thành công Vulkan trong công cụ phát triển trò chơi, bạn phải:
- Xác định thiết bị Android sẽ sử dụng với Vulkan
- Hiểu rõ một số điều cần đánh đổi khi hỗ trợ các thiết bị Android cũ
- Thêm Vulkan vào mục tiêu bản dựng Android
- Chọn một trình biên dịch cho chương trình đổ bóng để tạo SPIR-V cho Vulkan
- Xác định phiên bản API Vulkan hiện có trong thời gian chạy
- Tìm hiểu cách tối ưu hoá hoạt động kết xuất trong Vulkan bằng hồ sơ Vulkan, tốc độ khung hình và chế độ xoay trước
- Chọn các công cụ đồ hoạ để gỡ lỗi và phân tích hiệu suất
- Lưu ý: Để biết thông tin về cách sử dụng Vulkan trên Android bằng công cụ phát triển trò chơi trên Unity hoặc Unreal, vui lòng xem:
- Vulkan trên Unity
- Vulkan trên Unreal
Chọn thông số kỹ thuật tối thiểu của thiết bị cho Vulkan
Vulkan có sẵn trên Android kể từ Android 7.0 (API cấp 24). Chỉ có một số thiết bị Android chạy Android 7.0 trở lên hỗ trợ Vulkan. Bạn cần xác định những thiết bị Android dùng được Vulkan được trò chơi của bạn hỗ trợ.
Đề xuất
Để hỗ trợ Vulkan, hãy sử dụng các yêu cầu tối thiểu sau về thông số kỹ thuật:
- Thiết bị đang chạy Android 10.0 (API cấp 29) trở lên
- Thiết bị hỗ trợ API Vulkan phiên bản 1.1 trở lên
- Thiết bị có các tính năng và chức năng phần cứng tương thích với Hồ sơ cơ sở Android 2022
Hỗ trợ thiết bị cũ
Theo thiết kế, nếu trò chơi của bạn có thể chạy trên nhiều loại thiết bị với khả năng đồ hoạ ở nhiều mức độ, thì bạn cần hỗ trợ các thiết bị cũ hơn các thiết bị được đề xuất trong phần Chọn thông số kỹ thuật tối thiểu về thiết bị cho Vulkan. Trước khi xây dựng khả năng hỗ trợ cho các thiết bị cũ, hãy đánh giá xem Vulkan có mang lại các lợi ích cho trò chơi của bạn hay không. Các trò chơi có nhiều hàm gọi vẽ và sử dụng OpenGL ES có thể bị hao tổn đáng kể về trình điều khiển do mất nhiều chi phí khi thực hiện hàm gọi vẽ trong OpenGL ES. Những trò chơi này có thể bị CPU ràng buộc khi dành phần lớn thời gian kết xuất khung hình cho trình điều khiển đồ hoạ. Các trò chơi cũng có thể làm giảm đáng kể mức sử dụng CPU và pin khi chuyển từ OpenGL ES sang Vulkan. Điều này đặc biệt phù hợp nếu trò chơi của bạn có các cảnh phức tạp mà không thể sử dụng hiệu ứng nhiều mảnh ghép một cách hiệu quả để giảm thiểu hàm gọi vẽ. Khi nhắm đến các thiết bị cũ, hãy thêm tính năng hỗ trợ kết xuất OpenGL ES làm phương án dự phòng, vì một số thiết bị trong danh sách thiết bị mục tiêu của bạn có thể đã triển khai Vulkan. Điều này dẫn đến tình trạng không thể chạy trò chơi của bạn theo cách đáng tin cậy.
Có thể bạn không muốn hỗ trợ các thiết bị cũ có thể dùng Vulkan, vì các thiết bị này có hiệu suất kém và thiếu các tính năng hoặc có vấn đề về độ ổn định.
Hiệu suất và tính năng
Các thiết bị Android cũ có thể dùng Vulkan có thể không hỗ trợ hiệu suất kết xuất hoặc phần cứng cho các tính năng cần thiết để chạy trò chơi. Điều này đặc biệt có thể xảy ra nếu đồ hoạ trò chơi của bạn có độ chân thực cao và Vulkan là API duy nhất mà bạn đang nhắm mục tiêu trên Android. Nhiều thiết bị cũ chỉ dùng được API Vulkan phiên bản 1.0.3 và thường thiếu các tiện ích Vulkan được sử dụng rộng rãi trên phần cứng hiện đại hơn.
Độ ổn định
Các thiết bị Android cũ có thể đang dùng trình điều khiển Vulkan bị lỗi thời. Các phiên bản trình điều khiển này có thể chứa các lỗi làm ảnh hưởng đến độ ổn định của trò chơi. Việc xử lý các lỗi của trình điều khiển có thể mất nhiều thời gian để kiểm thử và xử lý kỹ thuật.
Thêm Vulkan vào dự án của bạn
Để thêm Vulkan vào dự án, bạn cần:
- Thêm các tiêu đề API Vulkan
- Biên dịch mã trong chương trình đổ bóng thành SPIR-V
- Gọi API Vulkan trong thời gian chạy
Thêm các tiêu đề API Vulkan
Trò chơi của bạn cần thêm các tệp tiêu đề API Vulkan để biên dịch mã sử dụng Vulkan. Bạn có thể tìm bản sao của các tiêu đề Vulkan trong Android NDK hoặc bản sao tiêu đề được đóng gói trong bản phát hành SDK Vulkan. Mọi phiên bản NDK cụ thể đều chỉ bao gồm các tiêu đề Vulkan có tại thời điểm phát hành NDK. Nếu bạn sử dụng các tiêu đề Vulkan của NDK, hãy dùng NDK phiên bản 25 trở lên, bao gồm cả các tệp tiêu đề hỗ trợ Vulkan phiên bản 1.3. SDK Vulkan có các tiêu đề phiên bản mới nhất.
Biên dịch mã trong chương trình đổ bóng thành SPIR-V
API Vulkan yêu cầu cung cấp các chương trình đổ bóng ở định dạng trung gian của tệp nhị phân SPIR-V. Quy ước này khác với OpenGL ES, trong đó, bạn có thể gửi mã nguồn được viết bằng Ngôn ngữ tô bóng OpenGL (GLSL) dưới dạng chuỗi văn bản. Sử dụng trình biên dịch chương trình đổ bóng để lấy mã viết bằng ngôn ngữ của chương trình đổ bóng như GLSL hoặc Ngôn ngữ cấp cao của chương trình đổ bóng (HLSL) rồi biên dịch mã đó thành các mô-đun SPIR-V để sử dụng với Vulkan.
Bạn có thể sử dụng trình biên dịch shaderc để biên dịch các chương trình đổ bóng được viết bằng GLSL thành SPIR-V. Nếu trò chơi của bạn sử dụng HLSL, thì DirectXShaderCompiler sẽ hỗ trợ đầu ra SPIR-V. Thông thường, bạn biên dịch các chương trình đổ bóng khi không có kết nối mạng trong quá trình tạo tài sản cho trò chơi của bạn và đưa các mô-đun SPIR-V vào tài sản trong thời gian chạy.
Gọi API Vulkan trong thời gian chạy
Để gọi API Vulkan, trò chơi của bạn cần chứa con trỏ hàm đến các lệnh gọi API Vulkan. Cách đơn giản nhất để thực hiện việc này là liên kết dựa vào thư viện chia sẻ libvulkan.so
có trong Android NDK. Việc liên kết dựa vào thư viện có 2 nhược điểm: chi phí điều phối hàm bổ sung và các giới hạn mà con trỏ hàm API Vulkan sẽ được tự động phân giải.
Khi bạn gọi một hàm API Vulkan, chế độ kiểm soát sẽ chuyển qua bảng điều phối được quản lý bằng một cấu trúc có tên là trình tải Vulkan. Android sử dụng quy trình triển khai trình tải Vulkan riêng chứ không dùng trình tải LunarG. Hệ thống trình tải này là một phần cấu trúc lớp của API Vulkan. Việc liên kết với thư viện hệ thống vào thời gian xây dựng sẽ dẫn đến một cấp điều phối bổ sung của một lệnh gọi API đã cho. Mặc dù mức hao tổn nhỏ, nhưng mức hao tổn này có thể đáng kể đối với các trò chơi thực hiện số lượng lớn lệnh gọi Vulkan.
Thư viện hệ thống thường chỉ phân giải con trỏ đến các hàm Vulkan được coi là một phần của API chính. Vulkan có một số lượng lớn tiện ích giúp xác định các hàm Vulkan bổ sung, nhiều hàm trong số này không được thư viện hệ thống tự động phân giải. Bạn cần phân giải con trỏ đến các hàm Vulkan này theo cách thủ công trước khi sử dụng.
Để giảm thiểu những vấn đề này, hãy tự động phân giải con trỏ đến tất cả các hàm Vulkan mà bạn định sử dụng trong thời gian chạy. Để thực hiện việc này, có thể dùng thư viện nguồn mở cho trình tải meta, chẳng hạn như volk. Trò chơi mẫu AGDKTunnel tích hợp volk cho mục đích này. Nếu bạn đang sử dụng một thư viện trình tải meta, không được liên kết dựa vào thư viện chia sẻ libvulkan.so
trong tập lệnh bản dựng của bạn.
Xác định phiên bản API Vulkan hiện có
Android hỗ trợ các phiên bản API Vulkan sau đây:
- 1.0.3
- 1.1
- 1.3
Số phiên bản API Vulkan cao nhất trên một thiết bị đã cho được xác định theo phiên bản Android và tính năng hỗ trợ trình điều khiển Vulkan.
Phiên bản Android
Khả năng hỗ trợ nền tảng của một phiên bản API Vulkan tuỳ thuộc vào phiên bản Android tối thiểu (cấp độ API):
- 1.3 – Android 13.0 (API cấp 33) trở lên
- 1.1 – Android 10.0 (API cấp 29) trở lên
- 1.0.3 – Android 7.0 (API cấp 24) trở lên
Hỗ trợ trình điều khiển Vulkan
Khả năng hỗ trợ nền tảng Android của một phiên bản API Vulkan không đảm bảo rằng phiên bản API sẽ được trình điều khiển Vulkan của thiết bị hỗ trợ. Một thiết bị chạy Android 13 có thể chỉ hỗ trợ API Vulkan phiên bản 1.1.
Khi khởi chạy Vulkan, không được yêu cầu phiên bản API lớn hơn:
- Phiên bản API Vulkan tối đa cho phiên bản Android chạy trên thiết bị
- Phiên bản API Vulkan do vkEnumerateInstanceVersion báo cáo
- Phiên bản API Vulkan do thuộc tính
apiVersion
của cấu trúc VkPhysicalDeviceProperties báo cáo
Sau đây là ví dụ về cách xác định phiên bản cao nhất của API Vulkan được hỗ trợ:
// Minimum Android API levels for Vulkan 1.3/1.1 version support
static constexpr int kMinimum_vk13_api_level = 33;
static constexpr int kMinimum_vk11_api_level = 29;
uint32_t GetHighestSupportedVulkanVersion(VkPhysicalDevice physical_device) {
uint32_t instance_api_version = 0;
vkEnumerateInstanceVersion(&instance_api_version);
VkPhysicalDeviceProperties device_properties;
vkGetPhysicalDeviceProperties(physical_device, &device_properties);
// Instance and device versions don't have to match, use the lowest version
// number for API support if they don't.
const uint32_t driver_api_version =
(instance_api_version < device_properties.apiVersion) ?
instance_api_version : device_properties.apiVersion;
const int device_api_level = android_get_device_api_level();
if (device_api_level >= kMinimum_vk13_api_level &&
driver_api_version >= VK_API_VERSION_1_3) {
return VK_API_VERSION_1_3;
} else if (device_api_level >= kMinimum_vk11_api_level &&
driver_api_version >= VK_API_VERSION_1_1) {
return VK_API_VERSION_1_1;
}
return VK_API_VERSION_1_0;
}
Xác định khả năng tương thích của hồ sơ Vulkan
Hồ sơ Vulkan là các tệp JSON xác định một tập hợp các tính năng, tiện ích, chức năng bắt buộc và giới hạn tham số tối thiểu mà thiết bị Vulkan phải hỗ trợ để tương thích với hồ sơ. Để xác định xem một thiết bị có tương thích với một hồ sơ Vulkan cụ thể hay không, chẳng hạn như Hồ sơ cơ sở Android 2022, hãy sử dụng thư viện nguồn mở cho API Hồ sơ Vulkan. Bạn cũng có thể tự phân tích cú pháp tệp JSON của hồ sơ và truy vấn các chức năng của thiết bị bằng cách sử dụng các API Vulkan thích hợp để xác định khả năng tương thích của hồ sơ.
Hồ sơ Vulkan
Android đang sử dụng Hồ sơ Vulkan để xác định những tính năng và tiện ích có sẵn cho từng thiết bị chạy Android.
Hồ sơ cơ sở Android (ABP) là nỗ lực đầu tiên trong việc xây dựng Hồ sơ Vulkan. ABP2021 và ABP2022 là các hồ sơ xem xét ngược nhằm mục đích bao phủ hơn 85% thiết bị đang hoạt động tại thời điểm đó. Từ nay trở đi, chúng tôi sẽ không tạo thêm ABP mới.
Hồ sơ Vulkan cho Android (VPA) là hồ sơ mới hướng tới tương lai nhằm phản ánh nhu cầu của nhà phát triển phần mềm và thúc đẩy các tính năng nhất quán ngay khi nhà phát triển phần cứng có thể cung cấp các tính năng đó. VPA15_minimums là hồ sơ đầu tiên cho Android 15 và mỗi năm sẽ có một VPA mới để bao gồm từng bản phát hành Android chính.
Triển khai tốc độ khung hình
Tốc độ khung hình phù hợp là một phần cần thiết để mang lại trải nghiệm chất lượng cao khi chơi trò chơi. Android Game Development Kit có thư viện Frame Pacing (Tốc độ khung hình) để giúp trò chơi của bạn đạt được tốc độ khung hình tối ưu. Để biết thêm thông tin về cách triển khai, hãy xem phần Tích hợp Android Frame Pacing (Tốc độ khung hình Android) vào trình kết xuất Vulkan của bạn.
Triển khai chế độ xoay trước
Các thiết bị Android có thể hiển thị theo nhiều hướng. Hướng của thiết bị có thể khác với hướng của giao diện kết xuất hình ảnh. Không giống như OpenGL ES trên Android, Vulkan không xử lý những khác biệt giữa 2 nền tảng này. Để hiểu được cách hoạt động của quy trình hướng và phương thức tối ưu để xử lý những khác biệt về hướng khi sử dụng Vulkan, hãy xem phần Xử lý hoạt động xoay thiết bị bằng chế độ xoay trước của Vulkan.
Khắc phục sự cố và phân tích tài nguyên kết xuất Vulkan
Có nhiều công cụ giúp bạn chẩn đoán các vấn đề kết xuất và hiệu suất với mã kết xuất hình ảnh trong Vulkan.
Để biết thêm thông tin về các công cụ gỡ lỗi và phân tích tài nguyên của Vulkan, hãy xem phần Công cụ và tính năng nâng cao.
Các lớp xác thực trong Vulkan
Lớp xác thực Vulkan là các thư viện trong thời gian chạy có thể được bật để kiểm tra lệnh gọi của bạn đến API Vulkan, đồng thời đưa ra cảnh báo hoặc lỗi về việc sử dụng không chính xác hoặc chưa tối ưu. Theo mặc định, các lớp xác thực này không hoạt động, vì quy trình xác thực sẽ làm tăng mức hao tổn trong thời gian chạy và ảnh hưởng đến hiệu suất của trò chơi. Để biết thông tin về cách sử dụng các lớp xác thực cho trò chơi của bạn, hãy xem bài viết Gỡ lỗi bằng lớp xác thực.
Công cụ chụp khung hình
Sử dụng các công cụ chụp khung hình để ghi lại và phát lại các lệnh gọi API Vulkan đã thực hiện trong một khung hình của trò chơi. Những công cụ này cho phép bạn:
- Xem thông tin và hình ảnh trực quan của các tài nguyên đồ hoạ đang hoạt động
- Xem trình tự của các lệnh gọi API mà trò chơi của bạn thực hiện và xem các tham số API
- Khám phá trạng thái của quy trình đồ hoạ tại thời điểm diễn ra hàm gọi vẽ
- Trực quan hoá kết quả kết xuất hình ảnh cho một hàm gọi vẽ cụ thể trong khung hình
Sử dụng công cụ nguồn mở RenderDoc để chụp khung hình của các trò chơi đang chạy trên Android. RenderDoc hỗ trợ tính năng chụp khung hình của cả Vulkan và OpenGL ES.
Bạn cũng có thể sử dụng Android GPU Inspector (AGI) để chụp khung hình trong Vulkan.
Công cụ phân tích hiệu suất
Sử dụng các công cụ phân tích hiệu suất để điều tra các sự cố về kết xuất (khiến tốc độ khung hình ở dưới mức tối ưu) trong trò chơi của bạn. Các nhà cung cấp GPU riêng lẻ cung cấp các công cụ được thiết kế để phân tích tài nguyên cho trò chơi của bạn và cung cấp dữ liệu về hiệu suất dành riêng cho cấu trúc GPU của họ. Đặc điểm về hiệu suất và điểm tắc nghẽn của trò chơi có thể thay đổi đáng kể khi kết xuất hình ảnh trên GPU của nhiều nhà cung cấp hoặc thậm chí trên một số thế hệ GPU của cùng một nhà cung cấp.
Bạn cũng có thể sử dụng Android GPU Inspector để thu thập và phân tích dữ liệu về hiệu suất. Không giống như các công cụ của nhà cung cấp, Android GPU Inspector tương thích với nhiều GPU của nhiều nhà cung cấp. Tuy nhiên, Android GPU Inspector không hỗ trợ các thiết bị Android cũ và có thể không tương thích với mọi thiết bị mới.
Cải thiện hoạt động kiểm thử Vulkan bằng CTS-D
Các nhà sản xuất thiết bị chạy Android sử dụng Bộ kiểm tra tính tương thích (CTS) để giúp đảm bảo rằng thiết bị của họ tương thích. CTS do nhà phát triển cung cấp (CTS-D) là các chương trình kiểm thử do nhà phát triển ứng dụng Android gửi để đảm bảo rằng các thiết bị Android trong tương lai đáp ứng các trường hợp sử dụng của họ và có thể chạy ứng dụng một cách trơn tru mà không gặp lỗi.
Nếu ứng dụng Vulkan của bạn kích hoạt một lỗi mới ảnh hưởng đến bất kỳ thiết bị Android cụ thể nào, bạn có thể gửi đề xuất kiểm thử mới, mô tả vấn đề và cách kiểm tra vấn đề đó. Điều này giúp đảm bảo rằng vấn đề sẽ được khắc phục trong bản cập nhật trong tương lai cho thiết bị, đồng thời đảm bảo rằng lỗi tương tự sẽ không xảy ra với bất kỳ thiết bị nào khác.
Hãy xem quy trình gửi CTS để biết hướng dẫn từng bước về cách gửi đề xuất kiểm thử.