Thêm hàm tốc độ khung hình

Sử dụng các hàm sau để dùng Android Frame Pacing với công cụ kết xuất dựa trên API Vulkan.

Xác định các tiện ích cần thiết cho việc tạo

Để thu thập bộ tiện ích cần thiết nhằm tạo một bản sao của Android Frame Pacing khi sử dụng Vulkan, hãy hoàn thành các bước hiển thị trong đoạn mã sau:

VkPhysicalDevice physicalDevice;
uint32_t availableExtensionCount;
VkExtensionProperties* pAvailableExtensions;
uint32_t requiredExtensionCount;
char** pRequiredExtensions;

// Determine the number of extensions available for this device.
vkEnumerateDeviceExtensionProperties(physicalDevice, layerName, &availableExtensionCount,
    pAvailableExtensions);

// Determine the number of required extensions.
SwappyVk_determineDeviceExtensions(physicalDevice, availableExtensionCount,
    pAvailableExtensions, &requiredExtensionCount, nullptr);

// Determine the required extensions.
pRequiredExtensions = (char**)malloc(requiredExtensionCount * sizeof(char*));
pRequiredExtensionsData = (char*)malloc(requiredExtensionCount * (VK_MAX_EXTENSION_NAME_SIZE + 1));
for (uint32_t i = 0; i < requiredExtensionCount; i++) {
    pRequiredExtensions[i] = &pRequiredExtensionsData[i * (VK_MAX_EXTENSION_NAME_SIZE + 1)];
}
SwappyVk_determineDeviceExtensions(physicalDevice, availableExtensionCount,
    pAvailableExtensions, &requiredExtensionCount, pRequiredExtensions);

Sau đó, bạn có thể khởi động Android Frame Pacing bằng cách gọi vkCreateDevice(). Đối số thứ 2, một cấu trúc thuộc loại VkDeviceCreateInfo*, phải đặt thành viên enabledExtensionCount thành số lượng các tiện ích cần thiết.

Xác định nhóm hàng đợi (queue family)

Để trình bày hàng đợi hiển thị chính xác, Android Frame Pacing cần biết Vulkan đang sử dụng nhóm hàng đợi nào. Để xác định đúng nhóm, hãy hoàn thành các bước có trong đoạn mã sau:

// Reusing local variables from previous snippets:
// VkPhysicalDevice physicalDevice;

const VkDeviceCreateInfo createInfo;
const VkAllocationCallbacks allocator;
VkDevice device;
uint32_t queueFamilyIndex;
uint32_t queueIndex;
VkQueue deviceQueue;

// Values of "device" and "deviceQueue" set in the 1st and 2nd function
// calls, respectively.
vkCreateDevice(physicalDevice, &createInfo, &allocator, &device);
vkGetDeviceQueue(device, queueFamilyIndex, queueIndex, &deviceQueue);
SwappyVk_setQueueFamilyIndex(device, deviceQueue, queueFamilyIndex);

Xác định tốc độ khung hình cho chuỗi hoán đổi

Để khởi chạy Android Frame Pacing cho một thiết bị thực tế và chuỗi hoán đổi nhất định, hãy hoàn tất các bước hiển thị trong đoạn mã sau:

// Reusing local variables from previous snippets:
// VkPhysicalDevice physicalDevice;
// VkDevice device;

// Assume that the JNI environment is available in:
// JNIEnv *env;
// jobject jactivity;

// Assume that swapchain is already known.
VkSwapchainKHR swapchain;
uint64_t refreshDuration; // in nanoseconds

// Determine duration between vertical-blanking periods.
// Example: 60 FPS sets "refreshDuration" to 16,666,666.
SwappyVk_initAndGetRefreshCycleDuration(env, jactivity, physicalDevice,
        device, swapchain, &refreshDuration);

Đoạn mã này xác định thời lượng hoán đổi (tính bằng nano giây). Có các macro trợ giúp được xác định trong swappy_common.h cho thời lượng hoán đổi thông thường (ví dụ: SWAPPY_SWAP_60FPS).

Tiếp theo, bạn cần cung cấp thời lượng hoán đổi tính bằng nano giây.

// Declare the periods in nanoseconds that should elapse before refreshing one
// image with the next image. There are helper macros defined in swappy_common.h
// for common swap durations.
// This example shows what to do when you want to render your game at 30 FPS.

SwappyVk_setSwapIntervalNS(device, swapchain, SWAPPY_SWAP_30FPS);

Thiết lập ANativeWindow

Swappy cần handle của ANativeWindow để thực hiện thao tác cụ thể của ANativeWindow, chẳng hạn như gọi ANativeWindow_setFrameRate(). Gọi SwappyVk_setWindow() khi giao diện màn hình Android đã thay đổi và bạn có một handle ANativeWindow mới (xem mẫu Hình lập phương để tìm hiểu ví dụ).

Chế độ tự động

Android Frame Pacing điều chỉnh thời lượng hoán đổi và chế độ quy trình dựa trên thời lượng trung bình của các khung trước. Bạn có thể kiểm soát hành vi này bằng các hàm sau:

Trình bày khung

Để trình bày khung trò chơi với Android Frame Pacing, hãy gọi SwappyVk_queuePresent(). Hàm này gọi vkQueuePresentKHR() thay mặt trò chơi của bạn.

Huỷ bỏ chuỗi hoán đổi

Để huỷ dữ liệu SwappyVk được liên kết với một chuỗi hoán đổi nhất định, hãy hoàn tất các bước hiển thị trong đoạn mã sau:

// Reusing local variables from previous snippets:
// VkDevice device;
// VkSwapchainKHR swapchain;
// const VkAllocationCallbacks allocator;

SwappyVk_destroySwapchain(device, swapchain);
vkDestroySwapchainKHR(device, swapchain, &allocator);