Vulkan API पर आधारित रेंडरिंग इंजन के साथ Android फ़्रेम पेसिंग का इस्तेमाल करने के लिए, इन फ़ंक्शन का इस्तेमाल करें.
एक्सटेंशन बनाने के लिए ज़रूरी एक्सटेंशन की पहचान करना
Vulkan का इस्तेमाल करते समय, Android फ़्रेम पेसिंग का इंस्टेंस बनाने के लिए ज़रूरी एक्सटेंशन का सेट इकट्ठा करने के लिए, कोड के इस स्निपेट में दिखाया गया तरीका अपनाएं:
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);
इसके बाद, vkCreateDevice()
को कॉल करके Android फ़्रेम पेसिंग शुरू की जा सकती है. दूसरे आर्ग्युमेंट, VkDeviceCreateInfo*
टाइप के स्ट्रक्चर में, enabledExtensionCount
सदस्य को ज़रूरी एक्सटेंशन की संख्या पर सेट किया जाना चाहिए.
कतार फ़ैमिली की पहचान करना
सही डिसप्ले क्यू दिखाने के लिए, Android फ़्रेम पेसिंग को यह पता होना चाहिए कि 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 फ़्रेम पेसिंग को शुरू करने के लिए, यहां दिए गए कोड स्निपेट में दिखाया गया तरीका अपनाएं:
// 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
से जुड़ी कार्रवाई करने के लिए, Swappy को ANativeWindow
के हैंडल की ज़रूरत होती है. जैसे, ANativeWindow_setFrameRate()
को कॉल करना.
जब आपका Android डिसप्ले सर्फ़ेस बदल गया हो और आपके पास नया ANativeWindow
हैंडल हो, तब कॉल करें SwappyVk_setWindow()
. उदाहरण के लिए, Cube सैंपल देखें.
ऑटो मोड
Android फ़्रेम पेसिंग, पिछले फ़्रेम की औसत अवधि के आधार पर स्वैप की अवधि और पाइपलाइन मोड को अडजस्ट करता है. इन फ़ंक्शन की मदद से, इस व्यवहार को कंट्रोल किया जा सकता है:
void SwappyVk_setAutoSwapInterval(bool enabled);
void SwappyVk_setMaxAutoSwapIntervalNS(uint64_t max_swap_ns);
void SwappyVk_setAutoPipelineMode(bool enabled);
कोई फ़्रेम प्रज़ेंट करना
अपने गेम के फ़्रेम को Android फ़्रेम पेसिंग पर प्रज़ेंट करने के लिए, SwappyVk_queuePresent()
को कॉल करें.
यह फ़ंक्शन, आपके गेम की ओर से vkQueuePresentKHR()
को कॉल करता है.
स्वैपचेन को डिस्ट्रॉय करना
किसी स्वैपचेन से जुड़े SwappyVk
डेटा को मिटाने के लिए, कोड स्निपेट में दिखाया गया तरीका अपनाएं:
// Reusing local variables from previous snippets: // VkDevice device; // VkSwapchainKHR swapchain; // const VkAllocationCallbacks allocator; SwappyVk_destroySwapchain(device, swapchain); vkDestroySwapchainKHR(device, swapchain, &allocator);