เพิ่มฟังก์ชันการกำหนดอัตราเฟรมเฟรม

ใช้ฟังก์ชันต่อไปนี้เพื่อใช้การเว้นระยะเฟรมของ Android กับเครื่องมือการแสดงผล ที่อิงตาม Vulkan API

ระบุส่วนขยายที่จำเป็นสำหรับการสร้าง

หากต้องการรวบรวมชุดส่วนขยายที่จำเป็นต่อการสร้างอินสแตนซ์ของ Android Frame Pacing เมื่อใช้ Vulkan ให้ทำตามขั้นตอนที่แสดงในโค้ดต่อไปนี้

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

จากนั้นคุณจะเริ่ม Android Frame Pacing ได้โดยเรียกใช้ vkCreateDevice() อาร์กิวเมนต์ที่ 2 ซึ่งเป็นโครงสร้างของประเภท VkDeviceCreateInfo* ควรมี enabledExtensionCount สมาชิกที่ตั้งค่าเป็นจำนวนส่วนขยายที่จำเป็น

ระบุตระกูลคิว

Android Frame Pacing ต้องทราบว่าตระกูลคิวใดที่ Vulkan ใช้เพื่อแสดงคิวการแสดงผลที่ถูกต้อง หากต้องการระบุตระกูลที่ถูกต้อง ให้ทําตาม ขั้นตอนที่แสดงในข้อมูลโค้ดต่อไปนี้

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

กำหนดอัตราเฟรมสำหรับ Swapchain

หากต้องการเริ่มต้น Android Frame Pacing สำหรับอุปกรณ์จริงและ Swapchain ที่ระบุ ให้ทำตามขั้นตอนที่แสดงในตัวอย่างโค้ดต่อไปนี้

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

ซึ่งจะกำหนดระยะเวลาการสลับเป็นหน่วยนาโนวินาที มีมาโครตัวช่วย ที่กำหนดไว้ใน swappy_common.h สำหรับระยะเวลาการสลับที่พบบ่อย (เช่น SWAPPY_SWAP_60FPS)

จากนั้น คุณต้องระบุระยะเวลาการสลับเป็นหน่วยนาโนวินาที

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

การตั้งค่า ANativeWindow

Swappy ต้องใช้แฮนเดิลของ ANativeWindow เพื่อดำเนินการ ANativeWindow ที่เฉพาะเจาะจง เช่น การโทรหา ANativeWindow_setFrameRate() เรียกใช้ SwappyVk_setWindow() เมื่อพื้นผิวการแสดงผลของ Android เปลี่ยนไปและคุณมีแฮนเดิล ANativeWindow ใหม่ (ดูตัวอย่างใน Cube sample)

โหมดอัตโนมัติ

การเว้นระยะเฟรมของ Android จะปรับระยะเวลาการสลับและโหมดไปป์ไลน์ตาม ระยะเวลาเฉลี่ยของเฟรมก่อนหน้า คุณควบคุมลักษณะการทำงานนี้ได้ด้วยฟังก์ชันต่อไปนี้

นำเสนอเฟรม

หากต้องการนำเสนอเฟรมของเกมไปยัง Android Frame Pacing ให้เรียกใช้ SwappyVk_queuePresent() ฟังก์ชันนี้เรียกใช้ vkQueuePresentKHR() ในนามของเกม

ทำลาย Swapchain

หากต้องการทำลายSwappyVkข้อมูลที่เชื่อมโยงกับ Swapchain ที่ระบุ ให้ทำตาม ขั้นตอนที่แสดงในข้อมูลโค้ดต่อไปนี้

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

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