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ũ
Nếu trò chơi của bạn được thiết kế để chạy trên nhiều loại thiết bị ở nhiều cấp độ đồ hoạ, bạn có thể cần hỗ trợ các thiết bị cũ hơn đề 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 tính năng hỗ trợ cho các thiết bị cũ, hãy đánh giá xem Vulkan có cung cấp hay không cho trò chơi của mình. Trò chơi có nhiều hàm gọi vẽ và sử dụng OpenGL ES có thể thấy mức hao tổn đáng kể cho người lái xe do chi phí cao cho việc thực hiện hàm gọi vẽ trong OpenGL ES. Những trò chơi này có thể bị ràng buộc bởi CPU khi chi tiêu quá nhiều thời gian kết xuất khung hình trong trình điều khiển đồ hoạ. Các trò chơi này cũng có thể giảm mức sử dụng CPU và pin bằng cách chuyển từ OpenGL ES sang Vulkan. Đây là đặc biệt phù hợp nếu trò chơi của bạn có các cảnh phức tạp không thể sử dụng hiệu quả nhiều mảnh ghép để giảm hàm gọi vẽ. Khi nhắm đến các thiết bị cũ, hãy thêm OpenGL ES hỗ trợ kết xuất dưới dạng 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ể có các phương thức triển khai Vulkan không thể chạy trò chơi của bạn một 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 Cấu hình Vulkan Quy tắc này xác định các tính năng và tiện ích mở rộng có sẵn cho mỗi thuộc tính thiết bị chạy Android.
Hồ sơ cơ sở Android (ABP) là lần đầu tiên xây dựng Hồ sơ Vulkan. ABP2021 và ABP2022 là những hồ sơ xem lại hướng đến việc cung cấp thông tin > 85% thiết bị đang hoạt động ở mức đó bất cứ lúc nào. Từ giờ trở đi, sẽ không có mã ABP mới nào.
Hồ sơ Vulkan dành cho Android (VPA) là một hồ sơ mới trong tương lai hướng tới phản ánh nhu cầu của các nhà phát triển phần mềm và thúc đẩy các tính năng nhất quán ngay lập tức vì các nhà phát triển phần cứng có thể phân phối chúng. VPA15_minimums là hồ sơ đầu tiên dành cho Android 15 và sẽ có một VPA mới mỗi năm để 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 của Vulkan, hãy xem 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 với trò chơi của bạn, hãy xem 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 quy trình kiểm thử Vulkan bằng CTS-D
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-D do nhà phát triển cung cấp là do các nhà phát triển ứng dụng Android gửi để đảm bảo rằng tương lai Các thiết bị Android đáp ứng được các trường hợp sử dụng và có thể chạy các ứng dụng trên đó một cách mượt mà và không có lỗi.
Nếu bạn tìm cách kích hoạt một lỗi mới với ứng dụng Vulkan, ảnh hưởng đến bất kỳ cho một thiết bị chạy Android cụ thể, bạn có thể gửi đề xuất thử nghiệm mới, trong đó mô tả sự cố bạn gặp phải và cách kiểm tra. Điều này đảm bảo rằng vấn đề được khắc phục trong một 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.
Tìm hiểu quy trình gửi Bộ công cụ đo lường kỹ thuật số (CTS) để được hướng dẫn từng bước về cách gửi đề xuất thử nghiệm.