ใช้ฟังก์ชันต่อไปนี้เพื่อใช้ Android Frame Pacing กับเครื่องมือการแสดงผล โดยอิงตาม Vulkan API
ระบุส่วนขยายที่จำเป็นในการสร้าง
เพื่อรวบรวมชุดส่วนขยายที่จำเป็นในการสร้างอินสแตนซ์ของ Android Frame การกำหนดอัตราเมื่อใช้ Vulkan ให้ดำเนินการตามขั้นตอนที่แสดงในโค้ดต่อไปนี้ snippet:
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);
กำหนดอัตราเฟรมสำหรับการสลับเชน
วิธีเริ่มต้น Android Frame Pacing สำหรับอุปกรณ์จริงและการแลกเปลี่ยนเชนหนึ่งๆ ทำตามขั้นตอนที่แสดงในข้อมูลโค้ดต่อไปนี้
// 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
การสลับต้องใช้แฮนเดิลของ ANativeWindow
เพื่อดำเนินการ
การดำเนินการเฉพาะ ANativeWindow
เช่น การโทร
ANativeWindow_setFrameRate()
โทร
SwappyVk_setWindow()
เมื่อพื้นผิวจอแสดงผล Android ของคุณเปลี่ยนไป และคุณมีANativeWindow
ใหม่
แฮนเดิล (ดูตัวอย่างในตัวอย่าง Cube)
โหมดอัตโนมัติ
การกำหนดอัตราการแสดงโฆษณาของ Android Frame จะปรับระยะเวลาการสลับและโหมดไปป์ไลน์โดยอิงตาม ระยะเวลาเฉลี่ยของเฟรมก่อนหน้า คุณสามารถควบคุมลักษณะการทำงานนี้ได้ด้วย ฟังก์ชันต่อไปนี้
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
ที่เชื่อมโยงกับการ Swapเชนหนึ่งๆ ให้ดำเนินการให้เสร็จสิ้น
ขั้นตอนที่แสดงในข้อมูลโค้ดต่อไปนี้
// Reusing local variables from previous snippets:
// VkDevice device;
// VkSwapchainKHR swapchain;
// const VkAllocationCallbacks allocator;
SwappyVk_destroySwapchain(device, swapchain);
vkDestroySwapchainKHR(device, swapchain, &allocator);