Menambahkan fungsi pengaturan kecepatan frame

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:

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);