ใช้ฟังก์ชันต่อไปนี้เพื่อใช้การเว้นระยะเฟรมของ 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 จะปรับระยะเวลาการสลับและโหมดไปป์ไลน์ตาม ระยะเวลาเฉลี่ยของเฟรมก่อนหน้า คุณควบคุมลักษณะการทำงานนี้ได้ด้วยฟังก์ชันต่อไปนี้
void SwappyVk_setAutoSwapInterval(bool enabled);
void SwappyVk_setMaxAutoSwapIntervalNS(uint64_t max_swap_ns);
void SwappyVk_setAutoPipelineMode(bool enabled);
นำเสนอเฟรม
หากต้องการนำเสนอเฟรมของเกมไปยัง 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);