Gunakan fungsi berikut untuk menggunakan Android Frame Pacing dengan mesin rendering berdasarkan Vulkan API.
Identifikasi ekstensi yang diperlukan untuk pembuatan
Untuk mengumpulkan serangkaian ekstensi yang diperlukan untuk membuat instance Android Frame Pacing saat menggunakan Vulkan, selesaikan langkah-langkah dalam cuplikan kode berikut:
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);
Anda kemudian dapat memulai Android Frame Pacing dengan memanggil vkCreateDevice()
. Argumen kedua, struct VkDeviceCreateInfo*
jenis, harus menyetel anggota enabledExtensionCount
-nya ke jumlah ekstensi yang diperlukan.
Identifikasi kelompok antrean
Untuk menampilkan antrean tampilan yang benar, Android Frame Pacing perlu mengetahui kelompok antrean mana yang digunakan Vulkan. Untuk menentukan kelompok yang benar, selesaikan langkah-langkah yang ditampilkan dalam cuplikan kode berikut:
// 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);
Tentukan frekuensi gambar untuk swapchain
Untuk melakukan inisialisasi Android Frame Pacing untuk perangkat fisik dan swapchain tertentu, lakukan langkah-langkah yang ditampilkan dalam cuplikan kode berikut:
// 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);
Ini menentukan durasi swap dalam nanodetik. Ada makro bantuan yang ditentukan di swappy_common.h
untuk durasi pertukaran umum (misalnya, SWAPPY_SWAP_60FPS
).
Selanjutnya, Anda perlu menyediakan durasi pertukaran dalam nanodetik.
// 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);
Menyetel ANativeWindow
Swappy memerlukan handle ANativeWindow
untuk melakukan
operasi khusus ANativeWindow
, seperti memanggil
ANativeWindow_setFrameRate()
.
Panggil SwappyVk_setWindow()
saat permukaan tampilan Android Anda berubah dan Anda memiliki handle ANativeWindow
baru (lihat sampel Cube untuk contoh).
Mode Otomatis
Android Frame Pacing menyesuaikan durasi pertukaran dan mode pipeline berdasarkan durasi rata-rata frame sebelumnya. Anda dapat mengontrol perilaku ini dengan fungsi berikut:
void SwappyVk_setAutoSwapInterval(bool enabled);
void SwappyVk_setMaxAutoSwapIntervalNS(uint64_t max_swap_ns);
void SwappyVk_setAutoPipelineMode(bool enabled);
Menampilkan frame
Untuk menampilkan frame game Anda ke Android Frame Pacing, panggil
SwappyVk_queuePresent()
.
Fungsi ini memanggil vkQueuePresentKHR()
atas nama game Anda.
Musnahkan swapchain
Untuk memusnahkan data SwappyVk
yang terkait dengan Swapantai tertentu, selesaikan langkah-langkah yang ditampilkan dalam cuplikan kode berikut:
// Reusing local variables from previous snippets: // VkDevice device; // VkSwapchainKHR swapchain; // const VkAllocationCallbacks allocator; SwappyVk_destroySwapchain(device, swapchain); vkDestroySwapchainKHR(device, swapchain, &allocator);